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方法,在这里再设置焦点即可。
来源:CSDN
作者:峰-_-zzz
链接:https://blog.csdn.net/yuzhoufeng10/article/details/103654977