我有一个RecyclerView,其元素包含一个EditText小部件。
1.目前专注于第二个EditText,第一个EditText部分显示在屏幕上。 the first EditText is partly showed
2.单击第一个EditText时,它会获得焦点,然后RecyclerView会自动向下滚动以完全显示第一个EditText。 RecyclerView automatically scroll down when first EditText got focused
这很棒,但我想要的是RecyclerView不应该自动滚动。 有解决方案吗 谢谢!
答案 0 :(得分:3)
实际上,你可以像这样控制RecycleView的滚动状态;
创建自己的LayoutManager并覆盖scrollHorizontallyBy
,如下所示。
@Override
public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) {
int nScroll = 0;
// Do not let auto scroll
if (recyclerView.getScrollState() != RecyclerView.SCROLL_STATE_SETTLING){
nScroll = super.scrollHorizontallyBy(dx, recycler, state);
}
}
那么,SCROLL_STATE_SETTLING
是什么?
RecyclerView目前正在动画到最终位置而不是 在外部控制之下。
答案 1 :(得分:2)
我最后通过禁用RecyclerView滚动来修复它,除了它接收触摸事件。
首先,我自定义了一个LayoutManager:
@Override
public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) {
if(!horizontal) {
return 0;
}
@Override
public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
if(!vertical) {
return 0;
}
收到点击事件时: 我将水平和垂直设置为false,这些导致RecyclerView无法再滚动!
和我subClass recyclelerView和Override onTouchEvent:
public boolean onTouchEvent(MotionEvent e) {
//we enable scrollHorizontallyBy and scrollVerticallyBy only in Touch Event, set layoutManager vertical and horizontal to true
......
return super.onTouchEvent(e);
}
所以当单击以找到焦点子节点是EditText时,MyRecyclerView无法滚动。但它可以在接收触摸事件时滚动!