RecyclerView:禁用由焦点变化引起的滚动

TL;DR我有一个s。当用户被聚焦并点击时,我想获得焦点,但我不想滚动。我怎样才能做到这一点?RecyclerViewEditTextEditText #1EditText #2EditText #2ReyclerView


我正在尝试与一堆s一起工作。当我专注于一个并单击另一个时,滚动使第二个位于屏幕顶部。我想从 中禁用此自动滚动,但我仍然希望用户能够滚动,并且我仍然希望对第二个进行聚焦,以便用户可以开始键入。我怎样才能做到这一点?RecyclerViewEditTextEditTextRecyclerViewRecyclerViewEditText

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

  • https://stackoverflow.com/a/8101614/4077294,但带有 .我打电话进来。RecyclerView.OnItemTouchListenerrecyclerView.requestFocusFromTouchonInterceptTouchEvent

    • 行为:滚动到顶部,一直点击。EditText
  • 通过EditText

    editText.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, bool hasFocus) {
            if (hasFocus) {
                v.clearFocus();
            }
        }
    });
    
    • 行为:键盘从未出现过,静止滚动到顶部。RecyclerView

完全禁用滚动是不可接受的,因为我仍然希望用户能够滚动。


答案 1

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

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

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

更新

由于 support-library v25.3.0,因此您还应该在 LayoutManager 中覆盖另一个 requestChildRectangleOnScreen 方法:

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

答案 2

RecyclerView 将滚动到获得焦点的项目。尝试 recyclerView.setFocusable(false)。这对我有用。