解决措施:
recyclerview设置setItemAnimation(null)
rvEpgSchList.setItemAnimator(null);
adapter设置setHasStableIds(true)
epgSchListAdapter.setHasStableIds(true);
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); }
文章来源: Recyclerview刷新数据时焦点丢失