在ViewHolder中使用自定义视图的行为异常

问题描述

我有一个带有适配器ChartAdapter的recyclerview,并且在第一个ViewHolder(MyChart)的布局中创建了一个自定义视图(ProgressViewHolder):

<com.android.MyChart
      android:id="@+id/chart"
      ... /> 

,此自定义视图(MyChart)的数据通过ProgressViewHolder方法populateData)的方法填充:

class ProgressViewHolder(
    val binding: ItemProgressBinding
) : BaseAdapter.BaseViewHolder<BaseEntry>(binding) {

    override fun bind(item: BasejourneyEntry,handler: Any?) {
        Log.d(TAG,"ProgressViewHolder,bind,$this")
        super.bind(item,handler)
        populateDataAfterLayoutReady(progressModel = item as ChartEntry)
    }

    private fun populateDataAfterLayoutReady(
        progressModel: chartEntry
    ) {
        binding.root.doOnLayout { populateData(progressModel) }
    }

    private fun populateData(сhartEntry: ChartEntry) {
        binding.chart.populateData(
            ChartData(
                values = getChartValues(сhartEntry)
            )
    )
}

自定义视图(MyChart)本身如下所示:

class MyChart @JvmOverloads constructor(
    context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : ConstraintLayout(context,attrs,defStyleAttr) {

    private val adapterItems = mutablelistof<ChartColumnData>()

    init {
        Log.d(TAG,"init,adapterItems.count = ${adapterItems.size},$this")
        ...
    }

    override fun onAttachedToWindow() {
        super.onAttachedToWindow()
        Log.d(TAG,"onAttachedToWindow,$this")
    }


    fun populateData(data: ChartData) {
        Log.d(TAG,"populateData,adapterItems.count = ${adapterItems.size}")
        Log.d(TAG,data.values.size = ${data.values.size}")

        if (adapterItems.isEmpty()) {
            val items = data.values
            adapterItems.addAll(items)
            Log.d(TAG,"populateData 2,adapterItems.count = ${adapterItems.size}")
        }
    }
}

启动应用程序后,我在Logcat中看到以下日志:

init,adapterItems.count = 0,com.android.MyChart{8e165bf V.E...... ......I. 0,0-0,0 #7f0b00f3 app:id/chart}
rogressViewHolder,ProgressViewHolder{7a05e16 position=0 id=-1,oldPos=-1,pLpos:-1 no parent}
onAttachedToWindow,0 #7f0b00f3 app:id/chart}
populateData,adapterItems.count = 0
populateData,data.values.size = 15
populateData 2,adapterItems.count = 15

在某个时刻,我(通过侦听器)从此自定义视图(onEndReached调用MyChart()方法,该方法将更新(添加)数据以填充此自定义视图,然后调用方法chartAdapter?.notifyItemChanged(0)。此自定义视图(MyChart)中的数据已更新,然后我看到以下日志:

onEndReached,adapterItems.count = 15
init,com.android.MyChart{c0f2b1c V.E...... ......I. 0,0 #7f0b00f3 app:id/chart}
ProgressViewHolder,ProgressViewHolder{581934c position=0 id=-1,data.values.size = 28
populateData 2,adapterItems.count = 28

,如果我再次调用onEndReached方法(通过侦听器更新(添加)数据以填充自定义视图)并调用chartAdapter?.notifyItemChanged(0)方法,则以下行在日志中可见:

onEndReached,adapterItems.count = 28
ProgressViewHolder,adapterItems.count = 15,com.android.MyChart{8e165bf V.E...... .......D 0,194-936,717 #7f0b00f3 app:id/chart}
populateData,adapterItems.count = 15
populateData,data.values.size = 41

因此,我在日志中看到的内容对我提出了一个问题:如何创建和使用最初的ProgressViewHolder{7a05e16MyChart{8e165bf实例,以及第一次调用{{1} }将创建这些类的其他实例-notifyItemChangedProgressViewHolder{581934c(并且MyChart{c0f2b1c调用init),但是在第二次调用MyChart之后,再次使用第一个实例:notifyItemChangedProgressViewHolder{7a05e16(并且不再调用MyChart{8e165bf的{​​{1}}方法)?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)