Android TV中使用RecyclerView左右长按或者连续按键焦点飞掉的问题:
复写LinearLayoutManager 的onInterceptFocusSearch方法:
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext){
@Nullable
@Override
public View onInterceptFocusSearch(@NonNull View focused, int direction) {
int count = getItemCount();
int fromPos = getPosition(focused);
int lastVisibleItemPos = findLastVisibleItemPosition();
int spanCount = lastVisibleItemPos - fromPos;
if (AppConfigurationUtils.isRtl && direction == View.FOCUS_RIGHT) {
direction = View.FOCUS_LEFT;
} else if (AppConfigurationUtils.isRtl && direction == View.FOCUS_LEFT) {
direction = View.FOCUS_RIGHT;
}
switch (direction) {
case View.FOCUS_RIGHT:
fromPos++;
break;
case View.FOCUS_LEFT:
fromPos--;
break;
}
if (fromPos < 0 || fromPos >= count) {
return focused;
} else {
if (fromPos > lastVisibleItemPos) {
scrollToPosition(fromPos);
} else {
int pos = lastVisibleItemPos - spanCount > 0 ? lastVisibleItemPos - spanCount : 0;
scrollToPosition(pos);
}
}
return super.onInterceptFocusSearch(focused, direction);
}
};```