RecyclerView:禁用由焦点更改引起的滚动

Jam*_* Ko 7 java android focus android-edittext android-recyclerview

TL; DR我有一个RecyclerViewEditText秒.当用户专注EditText #1并点击时EditText #2,我想EditText #2获得焦点,但我不想ReyclerView滚动.我怎样才能做到这一点?


我正在尝试RecyclerView使用一堆EditTexts.当我专注于一个EditText并且我点击另一个时,RecyclerView滚动使第二个位于屏幕的顶部.我想禁用此自动滚动RecyclerView,但我仍然希望用户能够滚动,我仍然希望第二个EditText关注,以便用户可以开始输入.我怎样才能做到这一点?

我已经尝试过以下解决方案:

  • /sf/answers/567113011/,但有一个RecyclerView.OnItemTouchListener.我叫recyclerView.requestFocusFromTouchonInterceptTouchEvent.

    • 行为:一直滚动到点击的顶部EditText.
  • EditText通过随时随地清除焦点

    editText.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, bool hasFocus) {
            if (hasFocus) {
                v.clearFocus();
            }
        }
    });
    
    Run Code Online (Sandbox Code Playgroud)
    • 行为:键盘从未出现,RecyclerView仍然滚动到顶部.

完全禁用此问题中的滚动是不可接受的,因为我仍然希望用户能够滚动.

Jam*_* Ko 18

我最终得到了@pskink的解决方案:

recylerView.setLayoutManager(new LinearLayoutManager(this) {
    @Override
    public boolean requestChildRectangleOnScreen(RecyclerView parent, View child, Rect rect, boolean immediate) {
        return false;
    }
});
Run Code Online (Sandbox Code Playgroud)

它似乎工作得很好,但@pskink已经提到使用箭头键时可能会出现问题.他在这里发布了另一个解决方案:https://pastebin.com/8JLSMkF7.如果您在使用上述解决方案时遇到问题,可以尝试在链接中使用替代解决方案.现在,我坚持我刚发布的那个.

UPDATE

从support-library v25.3.0开始,您还应该覆盖LayoutManager中的另一个requestChildRectangleOnScreen方法:

@Override
public boolean requestChildRectangleOnScreen(RecyclerView parent, View child, Rect rect, boolean immediate, boolean focusedChildVisible) {
    return false;
}
Run Code Online (Sandbox Code Playgroud)