除了adapter.notifyDataSetChanged()这个方法之外,新的Adapter还提供了其他的方法,如下:

public final void notifyDataSetChanged()
public final void notifyItemChanged(int position)
public final void notifyItemRangeChanged(int positionStart, int itemCount)
public final void notifyItemInserted(int position)
public final void notifyItemMoved(int fromPosition, int toPosition)
public final void notifyItemRangeInserted(int positionStart, int itemCount)
public final void notifyItemRemoved(int position)
public final void notifyItemRangeRemoved(int positionStart, int itemCount)

基本上看到方法的名字就知道这个方法是干嘛的了,

第一个方法没什么好讲的,跟以前一样。

notifyItemChanged(int position),position数据发生了改变,那调用这个方法,就会回调对应position的onBindViewHolder()方法了,当然,因为ViewHolder是复用的,所以如果position在当前屏幕以外,也就不会回调了,因为没有意义,下次position滚动会当前屏幕以内的时候同样会调用onBindViewHolder()方法刷新数据了。其他的方法也是同样的道理。

public final void notifyItemRangeChanged(int positionStart, int itemCount),顾名思义,可以刷新从positionStart开始itemCount数量的item了(这里的刷新指回调onBindViewHolder()方法)。

public final void notifyItemInserted(int position),这个方法是在第position位置被插入了一条数据的时候可以使用这个方法刷新,注意这个方法调用后会有插入的动画,这个动画可以使用默认的,也可以自己定义。

public final void notifyItemMoved(int fromPosition, int toPosition),这个方法是从fromPosition移动到toPosition为止的时候可以使用这个方法刷新

public final void notifyItemRangeInserted(int positionStart, int itemCount),显然是批量添加。

public final void notifyItemRemoved(int position),第position个被删除的时候刷新,同样会有动画。

public final void notifyItemRangeRemoved(int positionStart, int itemCount),批量删除。

这些方法分析完之后,我们来实现一个点击一个按钮,新增一条数据,长按一个item,删除一条数据的场景。

以下是新增一条数据的代码:

Person person = new Person(i, "WangJie_" + i, 10 + i);
adapter.notifyItemInserted(2);
personList.add(2, person);
adapter.notifyItemRangeChanged(2, adapter.getItemCount());

如上代码:

Line2:表示在position为2的位置,插入一条数据,这个时候动画开始执行。

Line3: 表示在数据源中position为2的位置新增一条数据(其实这个才是真正的新增数据啦)。

Line4: 为什么要刷新position为2以后的数据呢?因为,在position为2的位置插入了一条数据后,新数据的position变成了2,那原来的position为2的应该变成了3,3的应该变成了4,所以2以后的所有数据的position都发生了改变,所以需要把position2以后的数据都要刷新。理论上是这样,但是实际上刷新的数量只有在屏幕上显示的position为2以后的数据而已。如果这里使用notifyDataSetChanged()来刷新屏幕上显示的所有item可以吗?结果不会出错,但是会有一个问题,前面调用了notifyItemInserted()方法后会在执行动画,如果你调用notifyDataSetChanged()刷新屏幕上显示的所有item的话,必然也会刷新当前正在执行动画的那个item,这样导致的结果是,前面的动画还没执行完,它马上又被刷新了,动画就看不见了。所以只要刷新2以后的item就可以了。

看了RecyclerView的api,发现没有setOnItemClickListener--,所以还是自己把onItemClick从Adapter中回调出来吧。这个很简单,就像上面PersonAdaper中写的OnRecyclerViewListener那样。

长按删除的代码如下:

adapter.notifyItemRemoved(position);
personList.remove(position);
adapter.notifyItemRangeChanged(position, adapter.getItemCount());

代码跟之前插入的代码基本一致。先通知执行动画,然后删除数据源中的数据,然后通知position之后的数据刷新就可以了。

RecyclerView中notifyDataSetChanged刷新总结相关推荐

  1. RecyclerView用notifyDataSetChanged()刷新时候的图片闪烁

    1.ListView和RecyclerView的adapter在刷新上方法的不同: notifyItemChanged(int position) 更新列表position位置上的数据 notifyI ...

  2. 关于ListView中notifyDataSetChanged()刷新数据不更新原因

    使用Listview的时候: 当要动态显示更改后的 数据 (例如 数据 库改动), 很多人应该都用过notifyDataSetChanged();这个方法来刷新Listview,显示改后的 数据 . ...

  3. android listview 刷新数据,ListView中notifyDataSetChanged()刷新数据不更新原因分析

    标题 : 不作死就不会死!!!!!! 类 : ActivityA,ActivityB,BookListAdapter,Book,HttpManager 测试顺序 : ActivityA >> ...

  4. recycler 刷新图片闪烁_android 解决RecyclerView notifyDataSetChanged刷新闪屏问题(图片刷新)...

    最近遇到了RecyclerView  在执行notifyDataSetChanged操作时会出现闪屏,图片刷新,然后根据网上资料提示使用 修改动画,设置动画时间 recyclerView.getIte ...

  5. RecyclerView调用notifyDataSetChanged()不起作用

    背景 上周,之前的一个朋友发消息给我,RecyclerView的notifyDataSetChanged()方法没有用.心里一想,自己之前不就是这么用的么.但是好像脑海里有看到过也有人遇到了类似的问题 ...

  6. android 下载多个图片不显示不出来,RecyclerView中图片显示不出来的两种种可能解决方法...

    转载注明出处:简书-十个雨点 简单描述一下背景: 有一个页面,使用recyclerView展示一个列表,列表的每个元素是由一张图片.两个textview组成,很简单的布局.加载图片使用的的volley ...

  7. android notifydatasetchanged 不起作用,RecyclerView调用notifyDataSetChanged()不起作用

    背景 上周,之前的一个朋友发消息给我,RecyclerView的notifyDataSetChanged()方法没有用.心里一想,自己之前不就是这么用的么.但是好像脑海里有看到过也有人遇到了类似的问题 ...

  8. android局部动态刷新,RecyclerView的局部刷新爬坑之路简述

    RecyclerView的局部刷新爬坑之路简述,实际上RecyclerView做局部刷新是非常容易的,其实就是使用好带payload参数的这个notifyItemRangeChanged方法,以及ov ...

  9. Android进阶:RecyclerView中DiffUtil的使用

    本文转载自:https://blog.csdn.net/zxt0601/article/details/52562770 一.概述 DiffUtil是support-v7:24.2.0中的新工具类,它 ...

最新文章

  1. 网络游戏性能测试的几点想法
  2. 在用户控件中弹出消息框的方法
  3. git配置报错fatal: Authentication failed for ‘‘问题解决
  4. 水平分库分表的关键步骤和技术难点,分库分表的几种常见玩法及如何解决跨库查询等问题...
  5. linux下安装微信wechat
  6. 底层技术革命是如何爆发的?_转
  7. 深度之眼_Week2 编程作业1_梯度下降
  8. [翻译 EF Core in Action] 1.5 关于NoSql
  9. 管理感悟:深入理解软件
  10. neo4j python可视化_Python使用py2neo操作图数据库neo4j的方法详解
  11. CDR教程-使用调和工具制作三八天猫标志
  12. bundle包是什么意思_bundle与package区别与联系
  13. activeroot翻译,Active翻译
  14. 二代测序原理及其流程
  15. setup factory打包工具的使用
  16. Eureka工作原理(Eureka简介Eureka ServerEureka Client自我保护机制分布式系统中的CAP理论Eureka 工作流程)
  17. 网页版视频怎么加快播放速度
  18. 十分有用的cut剪切命令
  19. 国外主流搜索引擎提交入口
  20. 微分平坦(differential flatness)

热门文章

  1. c语言字符型和浮点型相加,C语言基础 整型、字符型和浮点型
  2. 生命线检查计算机还是连接线,生命线和智慧线相连起始段成锁链纹代表什么
  3. html作业给父亲的三行书信,给爸爸妈妈的一封信书信作文(精选3篇)
  4. 【C语言内功】“数据在内存中的存储“
  5. @Modifying注解,否则报错ORA-01002: 提取违反顺序
  6. 算法 - 凸包(Graham算法)
  7. 超图supermap实现BIM模型的属性查询
  8. PLC信号输入输出的基本概念【PLC学习】
  9. 基础实验2-2.2 求集合数据的均方差
  10. 假设你是一个报文,看路由器会如何处理你