当EditText聚焦时,Android EditText的容器(RecyclerView)自动滚动

时间:2016-04-21 09:23:50

标签: android scroll android-edittext android-recyclerview

我有一个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不应该自动滚动。 有解决方案吗 谢谢!

2 个答案:

答案 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无法滚动。但它可以在接收触摸事件时滚动!