如需转载请评论或简信,并注明出处,未经允许不得转载
系列文章
- android tv常见问题(一)焦点查找规律
- android tv常见问题(二)如何监听ViewGroup子View的焦点状态
- android tv常见问题(三)RecyclerView的焦点记忆
- android tv常见问题(四)焦点变化时,Recyclerview是如何进行滚动的
github地址
https://github.com/Geekholt/TvFocus
目录
期望结果
RecyclerView能够对焦点路径记忆。
问题分析
也就是说,当焦点从RecyclerView上移出的时候,需要保存RecyclerView当前聚焦的View,下次RecyclerVIew将要获得焦点的时候,主动聚焦到上一次聚焦的View上。
解决方案
- 设置RecyclerView在优先于它的子View获取焦点
setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
this.setFocusable(true);
- 在requestChildFocus方法中记录被聚焦的view
@Override
public void requestChildFocus(View child, View focused) {
super.requestChildFocus(child, focused);
if (null != child) {
//取得获得焦点的item的position
mLastFocusPosition = getChildViewHolder(child).getAdapterPosition();
}
}
- 在RecyclerView将要获取焦点的时候,主动设置上次一聚焦的View去获取焦点
@Override
public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
View lastFocusedView = getLayoutManager().findViewByPosition(mLastFocusPosition);
lastFocusedView.requestFocus();
return false;
}