面对RecyclerView的notifyDataSetChanged()方法无法刷新页面的实战经历

本文记录了一次在使用RecyclerView时遇到的刷新问题,数据源更新后,notifyDataSetChanged()无法触发界面刷新。通过断点调试发现onBindViewHolder()未被调用。原因在于数据源内存地址改变,以及RecyclerView的mObservers.size()为0,导致notifyDataSetChanged()无效。解决方案是确保数据源地址不变,并在装饰类中正确调用notifyDataSetChanged()。此外,当所有方法都无效时,可以尝试每次数据源更新后重新调用setAdapter()。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在项目中遇到了个需求,要一个带HeaderView的展示列表,ListView已成回忆,所以理所当然的选择了RecyclerView,但RecyclerView没有现成的脑袋……于是上网寻求答案。

参照了https://www.jianshu.com/p/0eebc6c2a08d这位朋友的文章,再次感谢无私的分享,呱唧呱唧。

然而,问题来了,在数据源更新后,使用notifyDataSetChanged()方法更新界面的时候,出现了问题,界面不更新,或者说一部分不更新……

例如,我先展示了两行数据,更换另一个包含两个不同数据的列表后,展示的还是前面的那两行;

如果我更换的是一个包含三个不同数据的列表的话,前两行不变,第三行展示的是新的数据。

于是侦探行动开始,出来吧,断点!

打了断点,发现只有在第一次加载数据的时候,onBindViewHolder方法会被调用,之后使用notifyDataSetChanged()方法,虽然数据源更新了,但onBindViewHolder却没被调用。

说打这里再打个断点:网上很多文章提及类似问题的时候,说的都是数据源内存地址不一致的原因,这是真的,大家一定要保证数据源的地址不变,不要赋值,不要新建。断点结束。

网上的法子对我都没啥效果,于是接着顺着断点往下走,发现RecyclerView的notifyDataSetChanged()方法调用过程,源码如下&

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值