我在另一个Recyclerview(GridLayoutManager
)中有一个垂直的Recyclerview(带有LinearLayoutManager
)。我现在面临的问题是,内部的recyclerview(使用GridLayoutManager)同时绑定它的所有项目,甚至是当前不在屏幕上的视图(onBindViewHolder()
被调用所有的它的项目)。
为了向您提供更多信息,在我的布局文件中,我将回收者视图的高度设为wrap_content
。
我认为问题是,因为有2个嵌套的垂直回收视图,当父RV想要测量其子项并且子项是另一个RV时,在onMeasure()
中它计算整个RV所需的大小,而不是只是它想要在屏幕上绑定的部分。
知道如何解决这个问题吗?
以下是我的外部Recyclerview的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/component_list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
以下是我的内部回收者视图的代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/gutter"
android:paddingBottom="@dimen/gutter">
<TextView
android:id="@+id/title_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/gutter"
android:textSize="30sp"
android:textColor="@android:color/white"
android:fontFamily="sans-serif-thin"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/my_slider"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
P.S。:我正在使用此适配器委托进行外部回收查看: https://github.com/sockeqwe/AdapterDelegates
答案 0 :(得分:5)
我认为嵌套的recyclerviews是一个非常糟糕的主意。当我尝试滚动时,哪个回收者视图必须回应骂人,孩子或孩子。
这就是为什么我认为你在寻找ExpandableListView?这仅限于两个级别的列表,但听起来它可以满足您的需求)。它也解决了解决问题。
它看起来像这样:
编辑:甚至可以嵌套ExpandableListViews:
编辑:检查this lib进行水平滚动
答案 1 :(得分:3)
这是一个已知的错误
您不应该将RecyclerView放在另一个RecyclerView 中,因为RecyclerView会为其子级提供无限空间。
因此,内部RecyclerView会持续测量直到数据集耗尽。
尝试在布局管理器上将setAutoMeasureEnabled(false)设置为false,或者使用包装器适配器而不是内部回收器视图来解决此问题。
答案 2 :(得分:0)
你需要知道的第一件事是,当你嵌套滚动布局时,内部布局将获得无限高度,有效地使它们成为wrap_content。实际上有一种相对简单的方法来解决这个问题。 假设我有两个嵌套的RecyclerViews,例如这些,在这种情况下是垂直方向的。
<RecyclerView
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical>
<View .../>
<!-- other stuff -->
<RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"/>
</RecyclerView>
这里的内部回收者视图每次都会立即绑定它的所有孩子,因为从它的位置,你的屏幕将具有无限的高度。
解决方案是将内部recyclerview的高度设置为某个静态值,而不是wrap_content或匹配parent,因为其中任何一个都只是用一个视图填充外部的recyclerview,因为它会一次绑定#&# 39;高度很大。如果您将内部Recyclerview的高度与显示器的高度相同,您应该会看到问题消失。
这是一个不会同时绑定所有孩子的实现:
<RecyclerView
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical>
<View .../>
<!-- other stuff -->
<RecyclerView
android:layout_width="match_parent"
android:layout_height="@dimen/screen_height"
android:orientation="vertical"/>
</RecyclerView>
请注意,内部RecyclerView的layout_height现在是从维度文件中提取的固定值。你自己必须拿出一个合理的价值放在那里。
备注:为了使所有这些工作和滚动正常工作,您可能必须在RecyclerViews中使用参数:NestedScrollingEnabled - 有几个与此相关的已知错误,您可能需要工作周围。
即:innerRecyclerView.setHasFixedSize(true);
和innerRecyclerView.setNestedScrollingEnabled(false)
。
答案 3 :(得分:0)
所以当你在另一个scrollview中放置一个scrollview(由于包装内容没有固定大小)时会发生什么(由于包装内容再次没有固定大小),两个嵌套滚动视图都无法呈现。
所以有两个解决方案 -
1-要么您必须考虑嵌套滚动视图的替代解决方案 2-您可以给外部的recyclerview单元固定高度,以便内部回收者视图可以获得一些固定的布局来呈现自己。
答案 4 :(得分:-3)
我可以通过只使用一个Recyclerview解决我的问题,它有一个网格布局,并根据我添加到其中的组件项,我更改了spancount
。基本上不是添加内部的recyclerview,而是将应该进入内部回收站视图的项目添加到外部回收站视图中。