【问题标题】:Disable Scrolling in child Recyclerview android在子 Recyclerview android 中禁用滚动
【发布时间】:2015-05-13 18:10:17
【问题描述】:

我的布局由一个父 RecyclerView 和一个子 Recyclerview 组成

我知道将列表放在另一个列表中并不好,但我必须这样做才能使用子列表功能,例如滑动和拖放

我的问题是子 Recyclerview 获得焦点并阻止父级滚动如果触摸点在它上面 如果触摸是垂直地在子 Recyclerview 上,我只是想要 父级上下滚动,如果触摸是水平的或单击,则子级 Recyclerview 列表项左右滑动。 有什么帮助来实现这一点吗?

【问题讨论】:

    标签: android android-listview android-recyclerview


    【解决方案1】:

    我终于找到了解决办法。

    创建自定义 LinearLayoutManager

    public class CustomLinearLayoutManager extends LinearLayoutManager {
    public CustomLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    
    }
    
    // it will always pass false to RecyclerView when calling "canScrollVertically()" method.
    @Override
    public boolean canScrollVertically() {
        return false;
    }
    }
    

    然后像这样实例化它以进行垂直滚动

    CustomLinearLayoutManager customLayoutManager = new CustomLinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false);
    

    最后将自定义布局设置为recycler view的布局管理器

    recyclerView.setLayoutManager(customLayoutManager);
    

    【讨论】:

    • 在 recyclerview 中效果很好。最好的方法
    • 完美解决方案。效果很好。但仅适用于 recyclerview 版本 23.2.0
    • 你太棒了。我还不如开始叫你大师.. Sensei
    【解决方案2】:

    android:nestedScrollingEnabled="false" 在子 RecyclerView 中

    你可以添加

    android:nestedScrollingEnabled="false"
    

    以 XML 格式发送到您的 RecyclerView 或

    childRecyclerView.setNestedScrollingEnabled(false);
    

    到你的 Java 中的 RecyclerView。

    编辑:-

    childRecyclerView.setNestedScrollingEnabled(false); 仅适用于 android_version>21 设备。要在所有设备上工作,请使用以下

    ViewCompat.setNestedScrollingEnabled(childRecyclerView, false);
    

    【讨论】:

    • 似乎也不适用于 >21 API。
    【解决方案3】:

    在您的 ActivityName.java 中,在 onCreate() 方法中写入:

    RecyclerView v = (RecyclerView) findViewById(R.id.your_recycler_view_id);
    v.setNestedScrollingEnabled(false);
    

    无论如何,如果您正在使用协调器布局,以防您想简化事情,并且想禁用嵌套滚动。

     <android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/activitiesListRV"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
     </android.support.v4.widget.NestedScrollView>
    

    你再次应用相同的原则: 在您的 ActivityName.java 上,在 onCreate() 方法中写入:

    RecyclerView v = (RecyclerView) findViewById(R.id.your_recycler_view_id);
    v.setNestedScrollingEnabled(false);
    

    所以基本上在 XML 中,你必须指定应用程序:layout_behavior

    app:layout_behavior="@string/appbar_scrolling_view_behavior">
    

    【讨论】:

    • 解决了我的问题,即支持 RecycleView 在 ScrollView 内滚动,即使 RecycleView 设置为 wrap_content。将 ScrollView 替换为支持 NestedScrollView,所有工作都按预期工作。谢谢!
    【解决方案4】:

    虽然嵌入回收器视图可能不是一个好习惯,但有时您无法避免它。这样的事情可能会奏效:

    public class NoScrollRecycler extends RecyclerView {
    
        public NoScrollRecycler(Context context){
            super(context);
        }
    
        public NoScrollRecycler(Context context, AttributeSet attrs){
            super(context, attrs);
        }
    
        public NoScrollRecycler(Context context, AttributeSet attrs, int style){
            super(context, attrs, style);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev){
    
            //Ignore scroll events.
            if(ev.getAction() == MotionEvent.ACTION_MOVE)
                return true;
    
            //Dispatch event for non-scroll actions, namely clicks!
            return super.dispatchTouchEvent(ev);
        }
    }
    

    这将禁用滚动事件,但不会禁用点击事件。将此类用于“子”RecyclerView。您希望 PARENT recyclerview 滚动,而不是孩子。好吧,应该这样做,因为父级将只是标准的 RecyclerView,但子级将是这个自定义的,没有滚动,但可以处理点击。可能需要禁用单击父 RecyclerView.. 不确定因为我没有测试过这个,所以认为它只是一个例子......

    此外,要在 XML 中使用它(以防你不知道),请执行以下操作:

    <com.yourpackage.location.NoScrollRecycler
         ...
         ... >
    
         ...
         ...
    
    </com.yourpackage.location.NoScrollRecycler>
    

    【讨论】:

    • 如何将此自定义回收器视图用于父回收器视图我需要父级滚动并禁用子级滚动,但也可以单击子级回收器视图的列表项
    • 现在更新答案。它应该可以工作,测试它并告诉我。
    • 孩子会是另一个视图组吗?是的,我相信是这样,但还没有尝试过这样做。我明天可以,但我想知道禁用滚动视图的滚动的目的是什么?只是好奇:)
    • @LucasCrawford 这个子 RecyclerView 在 ViewHolder 中吗?我问是因为我试过这个但没有用。请看:stackoverflow.com/questions/31632204/…
    • 您好 Lucas - 我对您的代码有疑问。我已经发布了一个单独的问题:stackoverflow.com/questions/32295840/…
    【解决方案5】:

    您可以在子RecyclerView 上使用setNestedScrollingEnabled(false);,它会停止在子RecyclerView 内滚动。

    在我的情况下,代码是

    mInnerRecyclerView.setNestedScrollingEnabled(false); 其中mInnerRecyclerView 是内部RecyclerView

    【讨论】:

      【解决方案6】:

      我觉得我来不及了,但如果它仍然让某人烦恼,我在这里找到了解决方案:

          RecyclerView v = (RecyclerView); 
          findViewById(R.id.your_recycler_view_id);
          v.setNestedScrollingEnabled(false);
          sensorsRecyclerView.setOnTouchListener(new View.OnTouchListener() {
          @Override
          public boolean onTouch(View v, MotionEvent    event) {
                  return true;
              }
          });
      

      【讨论】:

        【解决方案7】:

        我尝试了许多建议的解决方案,但找不到适合我的解决方案。我在使用 GridLayoutManager 的 ScrollView 中有超过 1 个 RecyclerView。上述建议的结果导致 ScrollView 在我抬起手指时停止滚动(当我的手指在 RecyclerView 上方抬起时它没有滑到视图的顶部或底部)

        查看 RecyclerView 源码,在 onTouchEvent 内部有一个对布局管理器的调用:

        final boolean canScrollHorizontally = mLayout.canScrollHorizontally();
        final boolean canScrollVertically = mLayout.canScrollVertically();
        

        如果您在自定义布局管理器中覆盖这些,返回 false 并且它将停止滚动。也解决了 ScrollView 突然停止滚动的问题。

        【讨论】:

          【解决方案8】:
           <RelativeLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content">
              <android.support.v7.widget.RecyclerView
                  android:id="@+id/rv"
                  android:layout_marginTop="2dp"
                  android:layout_marginLeft="2dp"
                  android:layout_marginBottom="10dp"
                  android:layout_marginRight="2dp"
                  android:nestedScrollingEnabled="false"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"/>
          </RelativeLayout>
          

          将代码放入LinearLayout...无需务实地做任何事情

          【讨论】:

            【解决方案9】:

            如果您不想制作自定义视图,另一种选择是在 RecyclerView 前面创建相同大小的布局,并使其可点击。

            编辑: 但不幸的是,它也阻止了列表项的事件。

            【讨论】:

              【解决方案10】:

              Kotlin 方式:

              recyclerView.layoutManager = object: LinearLayoutManager(recyclerView.context) {
                  override fun canScrollVertically(): Boolean {
                      return false
                  }
              }
              

              【讨论】:

                猜你喜欢
                • 2020-11-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-08-12
                • 1970-01-01
                • 2021-08-13
                相关资源
                最近更新 更多