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

RecyclerView: Disable scrolling caused by change in focus

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


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

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

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

我从@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。如果您对上述解决方案有疑问,您可以尝试 link 中的替代解决方案。现在,我坚持使用我刚刚发布的那个。

更新

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

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

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