当前位置: 首页 > 知识库问答 >
问题:

在NestedScrollView中使用RecyclerView将调用所有项的onBindView

阳凌
2023-03-14

我有两个recyclerviews垂直放置在linearlayout中。我需要使它们都可滚动,这就是为什么我将LinearLayout放在NestedScrollView

这是我的布局文件。

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:scrollbars="none">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

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

    <android.support.v7.widget.RecyclerView
        android:id="@+id/all_topic_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>
disableNestedScrolling(findViewById(R.id.all_topic_list));
disableNestedScrolling(findViewById(R.id.featured_list));

这可以很好地工作,但是会为列表中的所有项调用OnBindViewWholder方法。理想情况下,应该只针对列表中可见的项调用它。

我认为问题的发生是因为我将wrap_content赋予了recyclerview。关于这个问题的很多答案都表明这个问题在V23.2.1中得到了解决,但我已经在使用V26.1.0了。如何解决这个问题?

共有1个答案

南门向荣
2023-03-14

我也有同样的问题。recyclerviews不应放置在具有相同滚动方向的滚动容器中。视图回收仅在高度设置为match_parent时有效。

根据NestedScrollView中内容的复杂度和RecyclerView项的预期数量:

>

  • 忽略该问题。如果只有几个简单的项目,您可能根本不需要视图回收。

    特别是,这个包含数百个可能项目的组设置屏幕是由多个listviews组成的,该多个listviewsscrollview包装,没有任何视图回收。

    NestedScrollView替换为具有多个项目类型的单个ReyclerView,并将所有可滚动内容放入其中。如果您需要视图回收,就可以这样做。

    请注意,您还必须将NestedScrollView中的所有其他内容(页眉和页脚、间距)转换为RecyclerView项,并使用它们自己的ViewWholders

    如果设置相当简单,我建议您在没有附加库的情况下按照上面的链接来实现它。

    有几个不同的库可以解决您的问题(所有这些库都遵循第二种方法,只有一个recyclerView),但大多数库都带有您可能不需要的许多额外特性:

    它附带了一个ViewRenderer/ViewModel接口,它的工作方式类似于单个项目类型的“部分”RecyclerView。您将为每个项目类型创建一个,然后将它们注册到一个适配器中。

    一个由爱彼迎创建库/框架,在他们的应用程序中大量使用。它们有很多可滚动的内容(类似于网页),有很多不同的项目类型。Epoxy还有助于页面上不同项目的组合,当内容或其顺序发生变化时,它可以处理动画。如果你只需要一个屏幕,那就太多了。

    一个由Facebook创建的完整的UI框架,它自带了渲染引擎,取代了xml布局等等。据我所知,它允许您处理大量的项目(如Facebook时间线),视图回收是自动处理的。和Epoxy一样,只有当你的应用程序包含了很多不同项目类型的无休止滚动,并且你真的需要性能时,你才会使用它。

    我尝试了Epoxy和RendererRecolyerViewAdapter,但毕竟我创建了自己的多项类型适配器。它可以用不到100行的代码创建。

  •  类似资料:
    • 我在StackOverflow上看到了一些类似的事件。然而,这些似乎都不适用于我的情况。我遇到的问题是,我的RecyclerView正在工作,但没有显示任何内容。我已经运行了多个测试,试图找出它不工作的原因,但所有测试都支持它正常工作的事实。 getItemCount中的日志返回3,这是正确的数字。我只是不明白为什么它没有显示。我回头看了我在以前的活动中做的回收器视图,它们都在一定程度上匹配(其他

    • 如何在中使用?设置适配器后,内容不可见。 更新布局代码已更新。

    • 我在NestedScrollView中有一个RecyclerView。当recyclerView适配器列表较小时,它工作正常。但当列表太大时,它会使我的应用程序崩溃(或造成更多延迟)。我该怎么修呢。代码如下。 XML: 爪哇:

    • 如何使用网格布局管理器水平显示三行三列的循环视图项目,增加垂直增加的价值,类似于下图

    • 如何使用Espresso单击RecyclerView项目中的特定视图?我知道我可以使用以下方法单击位置0处的项目: 但我需要点击项目内部的特定视图,而不是项目本身。 提前道谢。 --编辑-- 更准确地说:我有一个RecolyerView(),其中的项目是CardView()。在每个CardView中,我有四个按钮(以及其他东西),我想单击一个特定的按钮()。 我想使用Espresso2.0的新功能

    • 与CardView layout_width=“match_parent”类似,它与父RecyclerView的宽度不匹配,但我正在尝试使其工作。 我正在尝试重现的与。 我的列表项的简化xml是: 扩展布局的代码是: 选择器可绘制bg_list_item.xml是: 可绘制bg_list_item_pressed。xml是: 如果我硬编码高度,例如用于选择器视图,则会显示选择器,但是项目可以更改高