在实现Android-TV的RecyclerView时需要帮助,其中焦点始终位于列表的第一项上,例如此处link
到目前为止,我所做的是使用 requestChildRectangleOnScreen 并计算到下一个孩子的滚动。但是我的高亮视图也随之滚动。如何保持焦点完整,仅滚动RecyclerView而不是其他方式滚动滚动?
public class RecyclerViewFirstFocus extends RecyclerView {
int dx = 0, dy = 0;
public RecyclerViewFirstFocus(Context context) {
super(context);
}
public RecyclerViewFirstFocus(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public RecyclerViewFirstFocus(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
View nextFocusView = null;
switch (event.getAction()) {
case KeyEvent.ACTION_DOWN:
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_DPAD_UP:
nextFocusView = FocusFinder.getInstance().findNextFocus(this, findFocus(), FOCUS_UP);
if (nextFocusView == null) {
return true;
}
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
nextFocusView = FocusFinder.getInstance().findNextFocus(this, findFocus(), FOCUS_DOWN);
if (nextFocusView == null) {
return true;
}
break;
}
break;
}
return super.dispatchKeyEvent(event);
}
@Override
public boolean requestChildRectangleOnScreen(View child, Rect rect, boolean immediate) {
View focusView = child.findFocus();
if (focusView == null)
return false;
focusView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
focusView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
focusView.getHeight();
Rect rectFocus = new Rect();
focusView.getDrawingRect(rectFocus);
offsetDescendantRectToMyCoords(focusView, rectFocus);
if (getLayoutManager().canScrollHorizontally()) {
dx = rectFocus.left;
} else if (getLayoutManager().canScrollVertically()) {
dy = rectFocus.top - 350;
}
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (immediate) {
scrollBy(dx, dy);
} else {
smoothScrollBy(dx, dy);
}
}
}, 150);
}
});
return true;
}
}
以前有人实施过吗?感谢您的帮助