Android-TV RecyclerView始终将焦点放在首位

时间:2018-07-13 05:12:50

标签: android android-recyclerview android-tv

在实现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;
}

}

以前有人实施过吗?感谢您的帮助

0 个答案:

没有答案
相关问题