在NestedScrollView中使用RecyclerView为所有项调用onBindView

the*_*ger 17 android android-recyclerview

我有两个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>
Run Code Online (Sandbox Code Playgroud)

另外,我在Java代码中禁用嵌套滚动.

disableNestedScrolling(findViewById(R.id.all_topic_list));
disableNestedScrolling(findViewById(R.id.featured_list));
Run Code Online (Sandbox Code Playgroud)

我的RecylerView库版本是26.1.0

这完全正常,但随后onBindViewHolder调用列表中的所有项目的方法.理想情况下,只应为列表中的可见项调用它.

我认为这个问题正在发生的事情,因为我给wrap_contentRecyclerView.关于这个问题的很多答案都表明这个问题在v23.2.1中得到了解决,但我已经在使用v26.1.0了.如何解决这个问题?

bof*_*mer 13

我有完全相同的问题.RecyclerViews并不意味着放置在具有相同滚动方向的滚动容器内.视图回收仅在高度设置为时有效MATCH_PARENT.

取决于内容的复杂性NestedScrollView和预期的RecyclerView项目数量:

  1. 忽略这个问题.如果只有几个简单的项目,您可能根本不需要查看回收.

    当我遇到问题时,我分析了其他流行应用的布局:例如,WhatsApp仅在其应用的某些部分使用RecyclerViews(或ListViews使用视图回收).

    特别是,具有数百个可能项目的该组设置屏幕由多个ListViews包裹的a组成ScrollView,没有任何视图回收.

  2. 多个项目类型替换NestedScrollView为单个 ReyclerView项目,并将所有可滚动内容放在其中.如果您需要查看回收,这是要走的路.

    请注意,您还必须将NestedScrollView(页眉和页脚,间距)中的所有其他内容转换为RecyclerView具有自己的项目ViewHolders.

    如果设置相当简单,我建议您按照上面的链接实现它而不需要额外的库.


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

RendererRecyclerViewAdapter

它带有一个ViewRenderer/ ViewModelinterface,就像单个项目类型的"部分"RecyclerView一样.您可以为每个项目类型创建一个,然后在单个适配器中注册它们.

环氧

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

光刻

一个由Facebook创建的完整UI框架,它带有自己的渲染引擎,xml布局的替代品等等.据我了解,它允许您处理大量项目(如Facebook时间轴),并自动处理视图回收.像Epoxy一样,如果您的应用程序包含诸如无限滚动和许多不同项目类型之类的内容并且您确实需要性能,那么您将只使用它.


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