本文主要阐述在使用RecyclerView中遇到notifyDataSetChanged列表不刷新问题,表现是:列表滑动时,notifyDataSetChanged可以正常刷新界面,但Fragment切换Tab后,再次滑动RecycleView,列表不刷新。
通过打断点调试,发现数据请求没有问题,每次滑动到底部时自动请求数据,在数据集上添加网络数据,通过打断点信息可得到size由20变为40,数据没有问题:

先看下notifyDataSetChanged实现:

public final void notifyDataSetChanged() {mObservable.notifyChanged();}

比较明显,观察者模式实现,数据改变了,通知观察者刷新。如果不刷新了,有几个怀疑点:
1:数据地址变了,不是同一个对象
打个比方:在数据A上注册了观察者,后面我们更改了数据B,然后调用了notify,此时必然列表不更新,常见的问题及解决办法:

list = data;
notifyDataSetChanged;

改为

list.clear();
list.addAll(data);
notifyDataSetChanged;

2:recycleview地址变了,不是同一个对象
情况类似1,只是由数据换成了recycleview,观察者不是同一个了,此时notify,更新的不是当前recycleView实例,因此必然看不到界面刷新。
此问题需要结合业务去看,主要通过打断点去看,notifyDataSetChanged时是否是同一个对象
3:数据和recycleview都是同一个地址,但绑定关系不在了
打个比方,数据A上注册了recycleview R,然后经过其他操作(如切换ntab),在切换tab声明周期中,无意间调用了unregisterAdapterDataObserver,导致A和R的绑定关系不在了,因此R不再刷新,
本次遇到的问题正好是情况3,单步调试下看下结果:

recyclerView和dataSource地址都没变(主要看@后面的数字),然后再notifyDataSetChanged处加断点,看内部执行情况,发现:

观察者的List为空了,按照猜测,肯定是无意间调用了unregisterAdapterDataObserver,导致数据和RecycleView绑定关系不在了,因此在unregisterAdapterDataObserver处打断点:

发现在封装时,在onDetachedFromWindow中无意间调用了unregisterAdapterDataObserver,问题根源已找到,解决办法:
unregisterAdapterDataObserver调用可以用标志位来控制,业务在使用封装的recycleview时,复写此标志位,用来控制是否unregister,这个地方需小心Recycleview的泄漏问题。

Android踩坑经验-notifyDataSetChanged列表不刷新问题分析相关推荐

  1. Android踩坑经验--App启动时间正确统计姿势

    在这里讨论的是指冷启动,热启动不在讨论范围内.如何正确衡量App的启动时间,一般有以下几种方法:AMS日志分析法,录屏分帧法,代码埋点法,logicat分析法等,本文重点阐述最常用的AMS日志分析法, ...

  2. Android踩坑之 couldnt find libClingSDK.so

    Android踩坑之couldn't find "libClingSDK.so" 在android开发中一些涉及到硬件级的API需要引入第三方的sdk,通常都是一个jar包搭配一个 ...

  3. 【Python】如何发布编写好的Python应用程序之Python Release for Windows(附踩坑经验)

    运筹优化博士,只做原创博文.更多关于运筹学,优化理论,数据科学领域的内容,欢迎关注我的知乎账号:https://www.zhihu.com/people/wen-yu-zhi-37 最近写了几个Pyt ...

  4. Android踩坑日记:RecyclerView中EditText和ImageView的ViewHolder复用坑

    RecyclerView中EditText和ImageView的ViewHolder复用坑 RecyclerView作为ListView的升级版,目前来讲讲开发过程遇到的坑. RecyclerView ...

  5. Colab使用经验总结(踩坑经验)------小白注意!

    文件上传至谷歌的云端硬盘 先压缩成zip,再在网盘用!unzip命令解压  !unzip '/content/drive/MyDrive/colab1/1.zip' -d '/content/driv ...

  6. gitlab的下载和安装教程我的踩坑经验

    #######这里就记录一下内网的安装包形式的安装过程############ 1.下载过程和安装过程 1)进入gitlab官网,platform>Install. --gitlab有极狐版,C ...

  7. spring boot 集成 redis spring-boot-starter-data-redis 2.1.7.RELEASE jedis: pool: #连接池配置 及踩坑经验

    目录 先上一些踩坑报错,各类报错 @org.springframework.beans.factory.annotation.Autowired(required=true) Error creati ...

  8. CU访谈录:DTCC讲师徐冬奇分享技术路上的挑战、踩坑、痛苦、成长 【总结分析】

    徐冬奇:  来自百度基础架构部大数据团队架构师,擅大数据平台(OLAP分析.用户属性挖掘).分布式存储等技术,目前关注广告平台. 2014-01-13 09:53 上传 下载附件 (26.99 K ...

  9. Android踩坑日记:监听软键盘多次调用和刷新系统相册和获取所有相片

    EditText设置监听软键盘删除键(或enter) 一般使用方法 edittext.setOnKeyListener(new View.OnKeyListener(){@Overridepublic ...

最新文章

  1. 谈一谈安防行业人工智能发展情况
  2. iOS证书申请详细流程
  3. C#中使用MD5对用户密码加密与解密
  4. vue实现星级评价效果
  5. 华为麒麟990芯片发布;谷歌宣布开源创新隐私保护技术;阿里20亿美元全资收购网易考拉;中国联通将设立100亿5G创新基金……...
  6. 电脑重启bootmgr_解决电脑开机出现bootmgr is compressed的两大妙招
  7. Andorid音频工具tinymix,tinyplay,tinycap使用
  8. python sys模块详解_python中os和sys模块的区别与常用方法总结
  9. 日常记账微信小程序模板源码
  10. 使用stm32f103rct6控制adf4351实现30M~~4G的正弦波
  11. python的cvtcolor_Python cv.CvtColor方法代碼示例
  12. 第1章 区块链是什么
  13. python股票量化交易入门到实践_Python股票量化交易从入门到实践
  14. 被逼无奈,沉默寡言的程序员也开始露脸拍视频了
  15. java stack top_Java中的堆栈类Stack类 - Break易站
  16. windows版本解说之长期服务版缺少应用商店的安装
  17. Oracle 中数据类型变更无效 ---ora-22858:数据类型的变更无效 for clod
  18. MacBookPro 18款 连接上WiFi却无法上网
  19. 基于网络的入侵检测数据集研究综述(A Survey of Network-based Intrusion Detection Data Sets)
  20. 我的2017年文章汇总——机器学习篇

热门文章

  1. c语言浮点型常量7.0f,C语言学习 - 浮点型数据类型
  2. get请求中文参数乱码的解决之道
  3. eclipse设置成全屏护眼色
  4. Android逆向 OPPO游戏中心SDK接入(单机)
  5. C++ make_shared() shared_prt()用法
  6. hap开发中的几个问题(遇到问题不慌不乱,想想问题的原因自然会解决)
  7. win10远程桌面连接设置方法
  8. 微信营销的特点 转载
  9. 基于A股供应链网络的股票收益分析
  10. String可不可变???