RecyclerView 焦点问题

我只是一个虾纸丫 提交于 2019-12-23 04:28:10

Android TV项目要求为RecyclerView列表增加焦点循环与翻页功能,本身功能不难实现,就是滚动列表,然后重定位焦点即可;

不过实际测试发现经常有焦点丢失的问题,让人十分头痛。

先看其中一个现象:

现象:焦点位于第一个item,向上移动,焦点定位到最后一个item,向下移动,焦点重新回到第一个item,再次向上移动,虽然有滚动到列表的底部,但是焦点丢失了。

分析:通过log发现,第二次向上移动时,最后一个item没有跑Adapter的onBindViewHolder函数,导致onBindViewHoler中设置焦点的代码没有跑

if (selectedPosition == position) {
    holder.container.requestFocus();
}

再分析log发现,第一次打开列表,会跑11次onBindViewHoler函数(page size为8),第一次移动到底部时onBindViewHoler也跑了11次,但第二次就只有8次了,最后的三个item没有跑onBindViewHoler来加载。

结论:RecyclerView自带的缓存机制导致这种问题,RecyclerView会预加载前后一定数量的item,这些item在显示时不会再次调用onBindViewHoler

对策:总之这是由于RecyclerView本身的机制导致,那么找一个item显示时一定会跑的方法来设置焦点即可

@Override
public void onViewAttachedToWindow(MyViewHolder holder) {
    super.onViewAttachedToWindow(holder);

    int position = mRecyclerView.getLayoutManager().getPosition(holder.container);
    if (position == selectedPosition) {
        holder.container.requestFocus();
    }
}

Item显示一定会跑onViewAttachedToWindow方法,在这里再设置焦点即可。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!