我在项目中遇到了个需求,要一个带HeaderView的展示列表,ListView已成回忆,所以理所当然的选择了RecyclerView,但RecyclerView没有现成的脑袋……于是上网寻求答案。
参照了https://www.jianshu.com/p/0eebc6c2a08d这位朋友的文章,再次感谢无私的分享,呱唧呱唧。
然而,问题来了,在数据源更新后,使用notifyDataSetChanged()方法更新界面的时候,出现了问题,界面不更新,或者说一部分不更新……
例如,我先展示了两行数据,更换另一个包含两个不同数据的列表后,展示的还是前面的那两行;
如果我更换的是一个包含三个不同数据的列表的话,前两行不变,第三行展示的是新的数据。
于是侦探行动开始,出来吧,断点!
打了断点,发现只有在第一次加载数据的时候,onBindViewHolder方法会被调用,之后使用notifyDataSetChanged()方法,虽然数据源更新了,但onBindViewHolder却没被调用。
说打这里再打个断点:网上很多文章提及类似问题的时候,说的都是数据源内存地址不一致的原因,这是真的,大家一定要保证数据源的地址不变,不要赋值,不要新建。断点结束。
网上的法子对我都没啥效果,于是接着顺着断点往下走,发现RecyclerView的notifyDataSetChanged()方法调用过程,源码如下&