如何彻底更改 recyclerview 中的 item 布局中的某个控件的某个属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何彻底更改 recyclerview 中的 item 布局中的某个控件的某个属性相关的知识,希望对你有一定的参考价值。

使用RecyclerView时,当想进行布局刷新时,我们通常会调用notifyItemChanged(int positon)进行布局刷新,如果item中图片的话,那么刷新就会出现闪烁,这是怎么回事了? 原因就是notifyItemChanged(int positon)是刷新整个item视图的,也就是重新调用onBindViewHolder方法进行item中所有控件的刷新,这自然会造成图片的重新设置了。
那么如果想要精细到刷新某个item中的某个控件呢?下面我就介绍下recyclerView中真正的布局刷新。
首先需要了解Adapter中的两个方法,一个是三个参数的onBindViewHolder(RecyclerView.ViewHolder holder, int position,List payloads),一个是两个参数的notifyItemChanged(int position, Object payload)。
看起来这2个方法比平时使用的多了一个payload参数,那么这个payload究竟有什么意义呢?在我的理解下,我认为payload可以用来存储一些变量值或者常数,然后在notifyItemChanged中传进去payload,指定某个item进行刷新,在这个Item的onBindViewHolder中就可以从第三个参数拿到传过来的payload。
参考技术A item当外部事件触发后,怎样彻底更改 recyclerview 的 itemview 中的某个控件的某个属性
比如 itemview 中的 edittext ,当外部事件触发后,彻底更改 edittex本回答被提问者采纳

recyclerview viewholder布局中的更改约束 - android

【中文标题】recyclerview viewholder布局中的更改约束 - android【英文标题】:Change constraint in recyclerview viewholder layout - android 【发布时间】:2019-09-29 02:32:01 【问题描述】:

我正在开发聊天应用程序,所以我希望时间 TextView 像什么应用程序一样,它的约束可以根据文本而改变

所以我在消息布局中尝试了视图树观察器,它以某种方式工作,但缺少一些东西

 private fun adjustTimeTextView() 

        var freeSpace: Float
        var lines: Int
        val messageViewObserver = messageView.messageLayout.viewTreeObserver
        messageViewObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener 

            override fun onGlobalLayout() 

                messageView.messageLayout.viewTreeObserver.removeOnGlobalLayoutListener(this)
                val viewWidth = messageView.messageLayout.width
                Log.e("message view width", viewWidth.toString())
                val layout = messageView.messageTextTextView.layout

                if (layout != null) 
                    lines = layout.lineCount
                    Log.e("line", lines.toString())

                    val offset = layout.getLineWidth(lines - 1)

                    freeSpace = viewWidth - offset
                    if (freeSpace < 220) 
                        Log.e("minmum", "low free space")
                        val constraintSet = ConstraintSet()
                        constraintSet.clone(messageView.messageLayout)
                        constraintSet.clear(messageView.messageLayout.messageTimeTextView.id, ConstraintSet.TOP)
                        constraintSet.clear(messageView.messageLayout.messageTimeTextView.id, ConstraintSet.BOTTOM)
                        constraintSet.clear(messageView.messageLayout.messageTimeTextView.id, ConstraintSet.START)
                        constraintSet.connect(
                            messageView.messageLayout.messageTimeTextView.id,
                            ConstraintSet.TOP,
                            messageView.messageLayout.messageTextTextView.id,
                            ConstraintSet.BOTTOM
                        )
                        constraintSet.applyTo(messageView.messageLayout)

                     else 
                        if (lines > 1) 
                            val constraintSet = ConstraintSet()
                            constraintSet.clone(messageView.messageLayout)
                            constraintSet.clear(
                                messageView.messageLayout.messageTimeTextView.id,
                                ConstraintSet.START
                            )
                            constraintSet.applyTo(messageView.messageLayout)

                        
                    
                
            

        )
    

这是我的布局 xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
>


<android.support.constraint.Guideline
    android:id="@+id/endGuideline"
    android:orientation="vertical"
    android:layout_
    android:layout_
    app:layout_constraintGuide_percent="0.65"/>

<android.support.constraint.Guideline
    android:id="@+id/startGuideline"
    android:orientation="vertical"
    android:layout_
    android:layout_
    app:layout_constraintGuide_percent="0.35"/>

<android.support.constraint.ConstraintLayout
    android:id="@+id/messageLayout"
    android:layout_
    android:layout_
    app:layout_constrainedWidth="true"
    android:padding="4dp"
    app:layout_constraintEnd_toStartOf="@+id/endGuideline"
    android:background="@drawable/sender_message_background"
    android:orientation="vertical"
    app:layout_constraintWidth_default="wrap"
    app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintTop_toBottomOf="@+id/messageDateTextView" android:layout_marginTop="8dp">


    <TextView
        android:id="@+id/messageTextTextView"
        tools:text="hi"
        android:layout_
        android:layout_
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0" android:layout_marginEnd="8dp"/>

    <TextView
        android:id="@+id/messageTimeTextView"
        android:layout_
        android:layout_
        android:text="12:34 pm"
        android:textSize="12sp"
        app:layout_constraintBottom_toBottomOf="@+id/messageTextTextView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/messageTextTextView"
        app:layout_constraintStart_toEndOf="@+id/messageTextTextView"
        android:layout_marginStart="8dp" app:layout_constraintVertical_bias="0.51"/>
</android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>

问题是,当我打开现有聊天时,第一个图像出现的约束在长消息中没有按预期工作,但是一旦我单击键入消息编辑文本,约束就更改为屏幕聊天而不是所有聊天,所以如果我滚动屏幕上的聊天限制,除非我点击输入消息编辑文本等等。

我是否缺少侦听器或请求焦点或其他内容或缺少什么

这是图一

这是图二

【问题讨论】:

【参考方案1】:

在我看来,这里的解决方案是使用app:layout_constrainedWidth="true"。请求布局是一项繁重的任务,不应在滚动时执行。

【讨论】:

拜托,您能否提供更多有关 app:layout_constrainedWidth="true" 及其作用和使用方法的信息?【参考方案2】:

它通过 make recyclerView 请求布局工作

我将此代码添加到 recyclerview 适配器

  override fun onAttachedToRecyclerView(recyclerView: RecyclerView) 
    super.onAttachedToRecyclerView(recyclerView)
    recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener()
        override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) 
            super.onScrolled(recyclerView, dx, dy)
            recyclerView.requestLayout()
        
    )

【讨论】:

以上是关于如何彻底更改 recyclerview 中的 item 布局中的某个控件的某个属性的主要内容,如果未能解决你的问题,请参考以下文章

当另一个片段中的数据发生更改时,如何刷新一个片段中的 RecyclerView

当sqlite android片段中的数据更改或删除时如何刷新recyclerview?

如何使用 Room 和 LiveData 保持 RecyclerView 顺序的更改?

如何更改 bg recyclerview 特定位置 [Kotlin]

如何点击Activity中的recyclerview项目? [复制]

Android:在 Recyclerview 中更改图像旋转