Recyclerview同时绑定所有视图

时间:2016-07-21 18:55:41

标签: android android-recyclerview gridlayoutmanager nestedrecyclerview

我在另一个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

5 个答案:

答案 0 :(得分:5)

我认为嵌套的recyclerviews是一个非常糟糕的主意。当我尝试滚动时,哪个回收者视图必须回应骂人,孩子或孩子。

这就是为什么我认为你在寻找ExpandableListView?这仅限于两个级别的列表,但听起来它可以满足您的需求)。它也解决了解决问题。

它看起来像这样:

enter image description here

编辑:甚至可以嵌套ExpandableListViews:

enter image description here

编辑:检查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,而是将应该进入内部回收站视图的项目添加到外部回收站视图中。