RecyclerView进行数据更新时焦点丢失的解决方案

RecyclerView进行数据更新时焦点丢失的解决方案

在使用RecyclerView时,难免会用到adapter的notifyDataSetChanged方法来更新数据,其实notify**Changed系列方法都存在一个已知的焦点丢失的bug,如果在notify之后重新手动requestFocus,又会导致焦点可能不对应的问题。

可以使用如下步骤规避此问题:

1.为adapter提供stableId
stableId在Listview和RecyclerView中都被用来定位一个item,官方建议使用item本身的hashcode或item内部的属性的hashcode,来唯一标识一个item,因此,需要在adapter中复写此方法:

    @Override  
    public long getItemId(int position) {  
        return position;  
    }

更简单一点,可以如上代码所示直接return item的position。
2.设置item的setHasStableIds()为true:

    adapter.setHasStableIds(true);  

在listview中也有复写此方法的方案。
3.在官方推荐的做法来看,这两步已经可以保存recyclerview的焦点了,但是使用notify系列方法仍然会出现focus丢失的问题,现在官方已经承认这是一个bug,可以暂时使用禁用notifyDataSetChanged动画的方法来规避:

    mRecyclerView.setItemAnimator(null);

这种写法禁用了所有的item动画,你也可以只禁用notifyDataSetChanged来实现同样的效果。

更多关于stableId的讨论请前往 http://stackoverflow.com/questions/10267731/android-how-to-make-an-adapter-with-stable-ids

更多关于禁用动画的方法请前往: http://stackoverflow.com/questions/29873859/how-to-implement-itemanimator-of-recyclerview-to-disable-the-animation-of-notify

关于第三步提到的bug请前往: https://code.google.com/p/android/issues/detail?id=204277

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,008评论 25 709
  • 简介: 提供一个让有限的窗口变成一个大数据集的灵活视图。 术语表: Adapter:RecyclerView的子类...
    酷泡泡阅读 10,600评论 0 16
  • 作者简介 创微信公众号郭霖 WeChat ID: guolin_blog 本篇来自CSDN_LQR的投稿,分析了F...
    木木00阅读 9,151评论 0 7
  • 又到了更新博文的时间了,最近在看一本很不错的心理学书籍,名字叫做 《拖延心理学》,封面长下面这样子 书的内容主要是...
    ec95b5891948阅读 57,691评论 38 472
  • 帅宝,真的是长大了,偶尔会睡整夜觉,咯咯咯咯睡着会笑出声,不知道做的什么美梦。 很久没来写文字,不是因为忘记,而是...
    金悦JY阅读 3,276评论 0 2