Recyclerview刷新数据时焦点丢失

匿名 (未验证) 提交于 2019-12-03 00:22:01

解决措施:

  1. recyclerview设置setItemAnimation(null)

    rvEpgSchList.setItemAnimator(null);
  2. adapter设置setHasStableIds(true)

    epgSchListAdapter.setHasStableIds(true);
  3. adapter中getItemId()返回position

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

RcyclerviewA的每个item嵌套recyclerviewB

解决措施:

首先要使整个recyclerview刷新时,焦点能被记住,我们需要手动保存B的当前焦点位置,即在B的adapter中onBindViewHolder方法中对B的itemview设置setOnFocusChangeListener,然后进行一些处理后,记录好B当前焦点Itme的位置

然后每次数据刷新时,B的adapter的onBindViewHolder会被调用,然后判断这时候传入的position是否跟之前存的焦点位置一致,一致的话,让itemview调用requestFocus方法就行。

但是,我们会发现,每次数据刷新时,B都会滚动到初始位置,也就是说如果B滑动了一段距离后,这时候判断焦点位置再请求焦点后,可能出现焦点不显示在屏幕上,那么我们需要在A的adapter的onBindViewHolder方法中,对B的recyclerview进行一些 判断处理

  • 先判断RecyclerviewB是否已经有layoutmanager了,如果包含了layoutmanager,则不要再去设置layoutmanager

         if(holder.recyclerView.getLayoutManager()== null){         GridEpgEventListStraggerLayoutManager layoutManagerSchList = new                 GridEpgEventListStraggerLayoutManager(                 1, StaggeredGridLayoutManager.HORIZONTAL         );         holder.recyclerView.setLayoutManager(layoutManagerSchList);     }
  • 再判断RecyclerviewB的adapter

        GridEpgEventListAdapter epgEpgEventListAdapter;     if(holder.recyclerView.getAdapter()!= null){         epgEpgEventListAdapter = (GridEpgEventListAdapter)holder.recyclerView.getAdapter();     }else{         epgEpgEventListAdapter  = new GridEpgEventListAdapter(context,epgManager                 ,epgFocusManager,position);          epgEpgEventListAdapter.setHasStableIds(true);          holder.recyclerView.setAdapter(epgEpgEventListAdapter);     }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!