28
社区成员
发帖
与我相关
我的任务
分享问1:如何解决recycleView列表数据不停新增时,使用notifyDataSetChanged()整体刷新的问题?
答:推荐adapter继承ListAdapter,它内部使用差异算法来对每次提交的数据列表进行比较,相同则不变,不同则会对这部分数据调用notifyItemChanged等细分刷新方法。
class xxxListAdapter(
private val retry: (uid: String) -> Unit
) :
ListAdapter<xxxInfo, RecyclerView.ViewHolder>(
itemCallback
) {
companion object {
val itemCallback = object : DiffUtil.ItemCallback<xxxInfo>() {
override fun areItemsTheSame(
oldItem: xxxInfo,
newItem: xxxInfo
): Boolean {
return oldItem.uid == newItem.uid
}
override fun areContentsTheSame(
oldItem: xxxInfo,
newItem: xxxInfo
): Boolean {
return oldItem.uid == newItem.uid && oldItem.maintenanceName == newItem.maintenanceName
}
}
}
}
问2:Androidrecycleview如何刷新局部列表数据状态等?
答:使用adapter.notifyItemChanged(position,payload)等一系列方法,可以刷新局部position下标下的item数据,也可以刷新一定范围内item,通过设置payload,传递参数如true,false来决定状态,int来决定数量等等。
adapter.notifyItemChanged(position, true)
override fun onBindViewHolder(
holder: MaintenanceItemsVerticalViewHolder,
position: Int,
payloads: MutableList<Any>
) {
super.onBindViewHolder(holder, position, payloads)
if (payloads.isNotEmpty()) {//也可以是其他类型值
holder.binding.checkMaintenanceItem.isChecked = payloads.get(0) == true
}
}
问3:有一个场景,用户点击列表进入详情需要把recycleview列表里面部分item的checkbox勾选中,在调用notifyItemChanged()方法后为何payload一直为空?
答:这个问题的解决办法就是在延迟局部刷新,代码如下:
lifecycleScope.launch {
delay(300) //延迟300ms防止notify数据导致payload被刷掉问题
xxx?.forEach {
adapter.notifyItemChanged(it.toInt() - 1, true)
}
}
出现这个问题原因大概是因为调用notifyItemChanged的时候adapter也在同时添加数据,因为此时添加数据会调用刷新方法,但是因为payload为null,会刷新整个布局,所以payload自然也就没有了。