【问题标题】:Android EditText's container (RecyclerView) auto scroll when EditText is FocusedAndroid EditText的容器(RecyclerView)在EditText被聚焦时自动滚动
【发布时间】:2016-08-14 09:34:19
【问题描述】:

我有一个 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 不应该自动滚动。 有什么解决办法吗? 谢谢!

【问题讨论】:

  • 将此添加到清单中的活动声明中--> android:windowSoftInputMode="stateVisible|adjustPan
  • 它不起作用。实际上我想要的是recyclerview根本不滚动,或者它在自动滚动时告诉我scrollX和scrollY,但在这种情况下滚动时它似乎根本不会通知任何注册的RecyclerView.OnScrollListener!这给我带来了很大的问题......我正在使用:com.android.support:recyclerview-v7:22+

标签: android scroll android-edittext android-recyclerview


【解决方案1】:

其实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 当前正在动画到最终位置,而不是 在外部控制之下。

【讨论】:

    【解决方案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 无法再滚动!

    我子类化了recyclerView并重写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);
    }
    

    所以MyRecyclerView在点击发现焦点子是EditText时无法滚动。但是在接收触摸事件时可以滚动!

    【讨论】:

      猜你喜欢
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 2019-10-23
      • 1970-01-01
      • 2022-08-06
      • 1970-01-01
      相关资源
      最近更新 更多