关于Android控件recycleView遇到的问题和处理办法

雪の星空朝酱
新星创作者: 移动开发技术领域
2022-09-01 20:45:04

问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自然也就没有了。

...全文
267 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-移动开发 发布问题, 以便更快地解决您的疑问

28

社区成员

发帖
与我相关
我的任务
社区描述
一起探究Android开发中遇到的问题,及新技术研究包括Flutter等学习使用
androidgithub经验分享 个人社区 江苏省·南京市
社区管理员
  • 雪の星空朝酱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

社区内分享我们的开发经验以及工作和平时学习遇到的问题,希望能帮助大家一起成长

  • 交流讨论 ——用于大家一些感想和问答
  • 开源——大家的开源项目及开发三方libraries的展示介绍
  • 问题贴——平时遇到的问题及后续追加的解决办法等

试试用AI创作助手写篇文章吧