RecyclerView:禁用因焦点变化引起的滚动
RecyclerView: Disable scrolling caused by change in focus
TL;DR 我有 RecyclerView
个 EditText
。当用户关注 EditText #1
并点击 EditText #2
时,我希望 EditText #2
获得焦点但我不希望 ReyclerView
滚动。我怎样才能做到这一点?
我正在尝试使用填充了一堆 EditText
的 RecyclerView
。当我专注于一个 EditText
并单击另一个时,RecyclerView
会滚动,以便第二个位于屏幕顶部。我想从 RecyclerView
禁用此自动滚动,但我仍然希望用户能够滚动,并且我仍然希望第二个 EditText
得到关注,以便用户可以开始输入。我怎样才能做到这一点?
我已经尝试过以下解决方案:
,但带有一个RecyclerView.OnItemTouchListener
。我在 onInterceptTouchEvent
.
中调用了 recyclerView.requestFocusFromTouch
- 行为:一直滚动到点击的
EditText
顶部。
通过
清除任何EditText
的焦点
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, bool hasFocus) {
if (hasFocus) {
v.clearFocus();
}
}
});
- 行为: 键盘从未出现,
RecyclerView
仍然滚动到顶部。
像 那样完全禁用滚动是不可接受的,因为我仍然希望用户能够滚动。
我从@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)。
这对我有用。
TL;DR 我有 RecyclerView
个 EditText
。当用户关注 EditText #1
并点击 EditText #2
时,我希望 EditText #2
获得焦点但我不希望 ReyclerView
滚动。我怎样才能做到这一点?
我正在尝试使用填充了一堆 EditText
的 RecyclerView
。当我专注于一个 EditText
并单击另一个时,RecyclerView
会滚动,以便第二个位于屏幕顶部。我想从 RecyclerView
禁用此自动滚动,但我仍然希望用户能够滚动,并且我仍然希望第二个 EditText
得到关注,以便用户可以开始输入。我怎样才能做到这一点?
我已经尝试过以下解决方案:
,但带有一个
中调用了RecyclerView.OnItemTouchListener
。我在onInterceptTouchEvent
.recyclerView.requestFocusFromTouch
- 行为:一直滚动到点击的
EditText
顶部。
- 行为:一直滚动到点击的
通过
清除任何EditText
的焦点editText.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, bool hasFocus) { if (hasFocus) { v.clearFocus(); } } });
- 行为: 键盘从未出现,
RecyclerView
仍然滚动到顶部。
- 行为: 键盘从未出现,
像
我从@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)。 这对我有用。