Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 嵌套的RecyclerView一次创建所有视图持有者_Android_Android Recyclerview_Android Viewholder_Nestedrecyclerview - Fatal编程技术网

Android 嵌套的RecyclerView一次创建所有视图持有者

Android 嵌套的RecyclerView一次创建所有视图持有者,android,android-recyclerview,android-viewholder,nestedrecyclerview,Android,Android Recyclerview,Android Viewholder,Nestedrecyclerview,我有一个嵌套的RecyclerViews的相当复杂的列表。我知道嵌套的RecyclerViews不是最好的解决方案,但在我的例子中,它是为数不多的创建结构化代码并满足需求的解决方案之一。我已经附上了结构的图像。你可以以电报为例来提高对结构的理解。基本上,我有一个带有项目RV-1-项目的外部RecyclerView RV-1和一个带有项目RV-2-项目的内部RecyclerView RV-2。到目前为止还不错,我的问题是外部RecyclerView按预期回收视图,但如果其中一个RV-1项目进入视图

我有一个嵌套的RecyclerViews的相当复杂的列表。我知道嵌套的RecyclerViews不是最好的解决方案,但在我的例子中,它是为数不多的创建结构化代码并满足需求的解决方案之一。我已经附上了结构的图像。你可以以电报为例来提高对结构的理解。基本上,我有一个带有项目RV-1-项目的外部RecyclerView RV-1和一个带有项目RV-2-项目的内部RecyclerView RV-2。到目前为止还不错,我的问题是外部RecyclerView按预期回收视图,但如果其中一个RV-1项目进入视图,则会创建RV-2的所有视图持有者(这意味着有时会创建100多个视图持有者)。总而言之,我的问题是如何强制内部RecyclerView RV-2也回收视图持有者

我知道内部RecyclerView RV-2必须具有较高的wrap_内容,因为它取决于内部项目的计数,而且我无法设置setHasFixedHeigth(true)(我不知道这是否有帮助),因为在运行期间,新的RV-2项目可以添加到RV-2中。我还尝试在RV-2上设置setNestedScrollingEnabled(false),因为我在网上读到了很多关于它的信息,但它也没有帮助我

所以基本上我就是这样配置的

RV-1

RV-2

除此之外,我还有一些ItemDecorator,但它们只在项目之间创建空间,所以它们不应该对问题做任何处理

总而言之: 外部RV-1按预期回收其视窗支架,但内部RV-2一次创建所有视窗支架,即使它们不在屏幕上。我假设是这样,因为RV-2具有包裹内容的高度,当需要测量布局高度时,它需要创建所有视图。问题是:有没有办法迫使RV-2回收其观点

编辑: 此外,我在所有RV-2 RecyclerViews之间使用共享的RecycleredViewPool,但这与问题无关,因为即使在RecyclerViews之间共享视图持有者,RV-2 RecyclerViews也不应创建初始化时不可见的视图持有者

编辑2: 很多评论和相关问题都说,两个垂直嵌套的RecyclerViews在android中是不可能的,如果所有的访问者都这么认为,我的问题是:你将如何实现这样的结构。很明显,我可以创建一个具有IM(圆形图像视图)和RV-2项目的单一视图,并在不需要时使IM不可见。在我看来,这不知何故使结构更加复杂。此外,一项要求是RV-1-Item左侧的IM必须能够在RV-1-Item中上下移动,这在我目前的结构中显然更容易实现

编辑3:(我的最后一个承诺) 我展示的问题可以通过使用我在编辑2中解释的方法来解决,即使这不是最好的解决方案。但问题是,我有一个更复杂的屏幕,这种方法不再有效,因为我有三个嵌套的RecyclerViews。我可以用edit2的方法把这个数字降到2,但是我仍然剩下两个嵌套的RecyclerViews,我想不出一个解决办法来解决剩下两个嵌套的RecyclerViews的问题。我附上了一个更复杂屏幕的图像,其中包含一个应用程序界面的标记部分,以帮助您理解结构

很多评论和相关问题都说两个垂直嵌套的RecyclerViews在android中是不可能的

事实并非如此;无论谁说这不是一件事,他都没有做,认为这是不可能的。这是有可能的,尽管有复杂的问题,副作用,最有可能的是,当你的用户点击试图上下滚动时,错误的触摸拦截器会得逞

为什么这是一个问题? 在iOS上,当你尝试做平台开发者认为不好的事情时,大多数人和其他开发者都会向你尖叫:不要与框架抗争。 在Android上,我们看到了最疯狂的Java(现在是Kotlin)实现,让你想知道我们——开发人员——在学校学习什么,我们在教什么?!但是没有人说什么(大部分):p

事实上,您正试图设计一个复杂的用户交互和数据转换,然而,您的尝试是有偏见的,因为您试图使用“现有”数据(这意味着要处理这两个不同的RV/适配器),而不是应该做的事情:转换数据以进行表示

这就引出了下一个问题:

您将如何实现这种结构

首先,我不知道你的数据是什么样子,也不知道它来自哪里;除了明显的滚动,我不知道你的用户能对你的数据做什么

除了你的模型,我也不知道你的数据想要如何呈现

但我非常了解情况。事物列表,其中也包含自己的事物列表

案例:列表的列表 这是可行的;你可以有一个列表,在上面的列表中,有另一个列表。我做到了。我见过其他人这样做。我用过。我也从不喜欢这个“小”可滚动的东西,当我点击“错误的地方”时,我会努力看谁先滚动

我不会这样做。如果内部列表很大(比如说每个外部项目超过3个项目),我不会将其显示为可滚动内容

I将要做的(考虑到我不知道您的问题)是使用一个列表来正确地显示所有内容

这与您的内容有关:

如果内部列表是超长的,这不会导致所有列表都显示出来吗?是的,这就是为什么如果数据(如您所述)可以有100个项目,我不会这样做。一个选项是
layoutManager = LinearLayoutManager(context)      
isNestedScrollingEnabled = false
setHasFixedSize(true)
layoutManager = LinearLayoutManager(context).apply {
    reverseLayout = true
}