12

另一个 Recycler View 内部有一个 Recycler View。两者都需要垂直滚动。外部回收器视图正确滚动,但内部回收器视图没有。

这是代码:

LinearLayoutManager mLayoutManager = new LinearLayoutManager(ViewActivity.this);
outerRecyclerView.setLayoutManager(mLayoutManager);
ViewAdapter adapter = new ViewAdapter(ViewActivity.this);
outerRecyclerView.setAdapter(adapter);

ViewAdapter 如下:

public void onBindViewHolder(ViewAdapter.ViewViewHolder holder, int position)
{
  //RECYCLER VIEW
  //TODO: Inner Recycler view scroll movement
  LinearLayoutManager mLayoutManager = new LinearLayoutManager(context);
  holder.protocolRecyclerView.setLayoutManager(mLayoutManager);
  ViewProtocolAdapter adapter = new ViewProtocolAdapter(context);
  holder.protocolRecyclerView.setAdapter(adapter);
}

我在两个回收站视图上都尝试了以下操作,但无法解决问题

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
       @Override
       public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
           if(rv.getChildCount() > 0) {
               View childView = rv.findChildViewUnder(e.getX(), e.getY());
               if(childView ==listView) {
                   int action = e.getAction();
                   switch (action) {
                       case MotionEvent.ACTION_DOWN:
                           rv.requestDisallowInterceptTouchEvent(true);
                   }
               }
           }

           return false;
       }

       @Override
       public void onTouchEvent(RecyclerView rv, MotionEvent e) {

       }

       @Override
       public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

       }
   });

也试过这个:

outerRecyclerView.setNestedScrollingEnabled(true);//Does not make any difference
innerRecyclerView.setNestedScrollingEnabled(true);//Recycler View start scrolling but very slowly and sometimes scrolls the outer one.
4

10 回答 10

21

将此 ontouch 监听器应用到内部回收器,该内部回收器可能位于父回收器的适配器中。

RecyclerView.OnItemTouchListener mScrollTouchListener = new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
    int action = e.getAction();
    switch (action) {
        case MotionEvent.ACTION_MOVE:
            rv.getParent().requestDisallowInterceptTouchEvent(true);
            break;
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {

}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

}
}; 

innerrecyclerView.addOnItemTouchListener(mScrollTouchListener);
于 2019-06-03T20:07:22.320 回答
3

前段时间实现回收器视图时我遇到了同样的问题。两个回收站视图都会开始滚动,对。尽管使用嵌套的回收器视图是一个坏主意,但如果您希望它正确滚动,则必须禁用内部的滚动。我不确定,但我认为是这样。让我知道它是否有效。如果不是,我会挖掘我的代码并尝试找到解决方案。

RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(parent.getContext()) {
            @Override
            public boolean canScrollVertically() {
                return false;
            }
        };
于 2016-06-02T19:28:07.583 回答
3

而不是使用 ScrollView 使用 android.support.v4.widget.NestedScrollView

对我来说,它工作得很好。

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="4dp"
            />

</android.support.v4.widget.NestedScrollView>
于 2018-10-17T13:34:24.757 回答
0

不要在回收站视图中保留回收站视图。相反,您应该夸大内部回收器视图。您可以在回收站视图的 onBindViewHolder 中拥有一个线性布局并膨胀该布局。通过这样做,您将永远不会遇到滚动问题。

于 2019-04-12T15:48:51.127 回答
0
parentScroll.setOnTouchListener(new View.OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event) {

        findViewById(R.id.childScroll).getParent()
           .requestDisallowInterceptTouchEvent(false);

        return false;
     }
});

childScroll.setOnTouchListener(new View.OnTouchListener() {

      public boolean onTouch(View v, MotionEvent event) {  

           v.getParent().requestDisallowInterceptTouchEvent(true);
           return false;
      }
});
于 2019-06-21T09:44:38.703 回答
0

对于 homever 可能有用,我做了一些我在一些帖子周围看到的东西。

首先,我制作了一个自定义 LinearLayoutManager 阻止垂直滚动。

    class CustomHorizontalLinearLayout(context: Context) :
LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) {

override fun canScrollVertically(): Boolean {
    return false
}

并将其设置为子 RecyclerView(在本例中称为 RecommendationRV):

itemView.recommendationRV?.apply {
                adapter = recyclerViewAdapter
                setRecycledViewPool(viewPool)
                setLayoutManager(layoutManager)
                setHasFixedSize(true)
            }

接下来我向子 RecyclerView ViewHolder XML 添加了一个外部 NestedScrollView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="220dp"
android:orientation="vertical"
android:background="@color/transparent"
android:paddingVertical="10dp">

<androidx.core.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recommendationRV"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/transparent"
        android:clickable="true"
        android:focusable="true"
        />
</androidx.core.widget.NestedScrollView>

这似乎奏效了。这可能不是最好的方法,但它对我来说就像一种魅力,所以我希望这可以帮助别人

于 2020-04-07T11:18:18.497 回答
0

您可以做的是,您可以添加一个滚动视图作为视图持有者的根布局,其中封装了第二个回收器视图。

  <ScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/subContainer"
    >
    <android.support.v7.widget.RecyclerView
        android:id="@+id/subList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
         />
</ScrollView>

之后,subList 回收器视图可以充分利用 wrap_content 属性。现在,要使其正常工作,您需要禁用子列表回收器视图的垂直滚动。

LinearLayoutManager layoutManager = new LinearLayoutManager(context) {
        @Override
        public boolean canScrollVertically() {
            return false;
        }
    }; 

这样做,所有垂直滚动事件都将由父回收器视图处理。

于 2017-01-05T12:58:29.950 回答
0

现在,要使其正常工作,您需要禁用子列表回收器视图的垂直滚动。

LinearLayoutManager layoutManager = new LinearLayoutManager(context) {
            @Override
            public boolean canScrollVertically() {
                return false;
            }
    }; 
于 2018-02-16T10:12:56.473 回答
0

尝试使用此代码,它适用于我

<androidx.core.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:isScrollContainer="true">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

 </androidx.core.widget.NestedScrollView>
于 2020-09-24T04:30:05.107 回答
-1

您不需要将 recyclerView 放在另一个 recyclerView 中。这根本不符合逻辑。如果您想将它们放在一个单一的布局 XML 中,只需按照以下步骤操作:

  • 使 NestedScrollView 成为父级
  • 在 NestedScrollView 中创建 LinerLayout
  • 将 RecyclerViews 放入 NestedScrollView

    <android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <LinearLayout
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
    
                <android.support.v7.widget.RecyclerView
                    android:id="@+id/firstRecycler"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"/>
    
                <android.support.v7.widget.RecyclerView
                    android:id="@+id/secondRecycler"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"/>
    
            </LinearLayout>
    </android.support.v4.widget.NestedScrollView>
    
于 2019-07-25T15:30:52.263 回答