问题描述
我有一个带有适配器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{7a05e16
和MyChart{8e165bf
实例,以及第一次调用{{1} }将创建这些类的其他实例-notifyItemChanged
和ProgressViewHolder{581934c
(并且MyChart{c0f2b1c
被调用init
),但是在第二次调用MyChart
之后,再次使用第一个实例:notifyItemChanged
和ProgressViewHolder{7a05e16
(并且不再调用MyChart{8e165bf
的{{1}}方法)?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)