当前位置: 首页 > news >正文

RecycleView刷新功能

RecycleView刷新某一个Item,或这某一个Item中某一个View。

这样的需求,在实际的开发中是很普遍的。

在数据变化后需要刷新列表。

刷新列表有三种方式:

前两种大家应该很熟,第三中会有点陌生。

 那么这三种方式,有什么却别呢?

  public void updateData() {notifyDataSetChanged();}public void updateData(int pos) {notifyItemChanged(pos);}public void updateData(int pos, Object payload) {notifyItemChanged(pos, payload);}

先看第一种:notifyDataSetChanged()

这个就属于暴力刷新了,他会刷新整个可见的item列表。刷新效率很差。我只想要更新某个Item中的TextView,但是这种方式,会导致全部Item列表重新绘制一遍。

    findViewById(R.id.button1).setOnClickListener(v -> {int pos = 0;Person person = list.get(pos);person.name = "update";person.age = 44;adapter.updateData();});public void updateData() {notifyDataSetChanged();}

从日志中可以看出来,这种刷新方式,会把所有的Item重新绘制一遍。

再看第二种刷新方式: notifyItemChanged(pos);

 findViewById(R.id.button2).setOnClickListener(v -> {int pos = 0;Person person = list.get(pos);person.name = "update";person.age = 55;adapter.updateData(pos);});public void updateData(int pos) {notifyItemChanged(pos);}

   这种方式会根据传进来的pos来刷新对应的某一个Item。但是Item中会包含其他的View,

也会导致其他的View跟着刷新,虽然有了较大的优化,但是还是有一些画蛇添足。

看日志:

从日志可以看出,的确刷只刷新了某一个Item。但是整个Item中定义的View也会跟着一起绘制,

会执行onLayout,onMeasure,onDraw三个绘制方式。

我只修改了某个View,只需要重新绘制更新的VIew就行,没有更新的不用跟着计算。

再看第三种方式,

传进去了一个标识,需要在重写onBindViewHolder的重载方法。

 findViewById(R.id.button3).setOnClickListener(v -> {int pos = 0;Person person = list.get(pos);person.name = "payload";person.age = 66;adapter.updateData(pos, "name");});
    public void updateData(int pos, Object payload) {notifyItemChanged(pos, payload);}

 根据传进来的标识,只改变,需要修改的VIew。前提是要修改的View的大小不会变化,只改变状态,因为Item中其他的View不刷新。如果大小改变的话,可能会导致布局跟着变,这时就得需要item去重新计算来绘制了。

 @Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position,             @NonNull List<Object> payloads) {Log.e("nyz", "onBindViewHolder pos " + position);if (!payloads.isEmpty() && payloads.get(0).equals("name")) {Log.e("nyz", "update name");Person person = list.get(position);((MyViewHolder) holder).nameTv.setText(person.name);} else {Log.e("nyz", "update item");super.onBindViewHolder(holder, position, payloads);}}

看日志:

确实只修改了需要修改的View,并没有导致整个View进行重新绘制。

代码下载:https://download.csdn.net/download/niuyongzhi/88382724

http://www.lryc.cn/news/178299.html

相关文章:

  • 目标检测如何演变:从区域提议和 Haar 级联到零样本技术
  • 聊一聊国内大模型公司,大模型面试心得、经验、感受
  • 【分布式微服务】feign 异步调用获取不到ServletRequestAttributes
  • c#编程里面最复杂的技术问题有哪些
  • github代码提交过程详细介绍
  • Linux -- 使用多张gpu卡进行深度学习任务(以tensorflow为例)
  • Mendix中的依赖管理:npm和Maven的应用
  • 自定义hooks之useLastState、useSafeState
  • 前端判断: []+[], []+{}, {}+[], {}+{}
  • el-input-number/el-input 实现实时输入数字转换千分位(失焦时展示千分位)
  • 一篇博客学会系列(2)—— C语言中的自定义类型 :结构体、位段、枚举、联合体
  • KongA 任意用户登录漏洞分析
  • 吉力宝:智能科技鞋品牌步力宝引领传统产业创新思维
  • 【IPC 通信】信号处理接口 Signal API(1)
  • 使用GDIView排查GDI对象泄漏导致的程序UI界面绘制异常问题
  • 蓝桥等考Python组别一级001
  • Unity之Hololens2开发 如何接入的MRTK OpenXR Plugin
  • Ubuntu系统Linux内核安装和使用
  • 数学术语之源——群同态的“核(kernel)”
  • defcon-quals 2023 crackme.tscript.dso wp
  • 前端开发 vs. 后端开发:编程之路的选择
  • 算法练习4——删除有序数组中的重复项 II
  • 【C++进阶(六)】STL大法--栈和队列深度剖析优先级队列适配器原理
  • linux opensuse使用mtk烧录工具flashtool
  • Visio如何对文本打下标、上标,以及插入公式编辑器等问题(已解决)
  • 快速将iPhone大量照片快速传输到电脑的办法!
  • TCP/IP协议簇包含的协议
  • 天地图绘制区域图层
  • git权限不够:Ask a project Owner or Maintainer to create a default branch
  • AI在材料科学中的应用