19

GridLayoutManager在另一个recyclerview(带有)中有一个垂直的recyclerview(带有a 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>

这是我的内部 recyclerview 的代码:

<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>

PS:我将这个适配器委托用于我的外部 recyclerview: https ://github.com/sockeqwe/AdapterDelegates

4

5 回答 5

6

我认为嵌套的recyclerviews 是一个非常糟糕的主意。当我尝试滚动时,哪个 recyclerview 必须响应 scolling、父母或孩子。

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

它看起来像这样:

在此处输入图像描述

编辑:甚至嵌套的 ExpandableListViews 是可能的:

在此处输入图像描述

编辑:检查这个库的水平滚动

于 2016-07-31T21:19:46.413 回答
3

这是一个已知的错误。
您不应该将 RecyclerView 放在另一个 RecyclerView 中,因为 RecyclerView 为其子级提供了无限空间。
因此,内部的 RecyclerView 一直在测量,直到数据集用完。
尝试在布局管理器上将 setAutoMeasureEnabled(false) 设置为 false,或者您可以通过使用包装适配器而不是内部回收器视图来解决此问题。

于 2016-07-26T14:11:12.987 回答
0

因此,当您将滚动视图(由于包装内容而没有固定大小)放入另一个滚动视图(由于包装内容再次没有固定大小)时,这里会发生什么,两个嵌套滚动视图都无法呈现。

所以有两种解决方案——

1-您必须考虑嵌套滚动视图的替代解决方案 2-您可以为外部 recyclerview 单元格提供固定高度,以便内部 recycler 视图可以获得一些固定布局来呈现自身。

于 2016-07-29T14:20:44.533 回答
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 每次都会立即绑定它的所有子视图,因为从它的位置来看,您的屏幕将具有无限的高度。

解决方案是将内部 recyclerview 的高度设置为某个静态值,而不是 wrap_content 或匹配父级,因为其中任何一个都会简单地用一个视图填充外部 recyclerview,由于它的高度很大,该视图将立即被绑定。如果您使内部 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)

于 2016-07-25T19:26:54.637 回答
-3

我可以通过只使用一个 Recyclerview 来解决我的问题,它有一个网格布局,并根据我添加到其中的组件项目,我spancount为此更改。基本上,我没有添加内部recyclerview,而是将应该进入内部recyclerview 的项目添加到外部recyclerview。

于 2016-08-02T23:36:39.277 回答