- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有两个 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>
另外,我在 Java 代码中禁用了嵌套滚动。
disableNestedScrolling(findViewById(R.id.all_topic_list));
disableNestedScrolling(findViewById(R.id.featured_list));
我的RecylerView
库版本是26.1.0
这完美地工作,但是 onBindViewHolder
方法被调用用于列表中的所有项目。理想情况下,只应为列表中的可见项调用它。
我认为问题的发生是因为我将 wrap_content
提供给 RecyclerView
。关于 this 的很多答案问题表明该问题已在 v23.2.1 中解决,但我已经在使用 v26.1.0。如何解决这个问题?
最佳答案
我遇到了完全相同的问题。 RecyclerViews
不应放置在具有相同滚动方向的滚动容器内。 View 回收仅在高度设置为 MATCH_PARENT
时有效。
根据 NestedScrollView
内部内容的复杂性和 RecyclerView
项的预期数量:
忽略这个问题。如果只有几个简单的项目,你可以根本不需要查看回收。
当我遇到这个问题时,我分析了其他流行应用程序的布局:例如,WhatsApp 仅在某些部分使用了 RecyclerViews
(或 ListViews
with view recycling)他们的应用程序。
特别是,this group settings screen有数百个可能的项目由多个 ListViews
组成,被 ScrollView
包裹,没有任何 View 回收。
将 NestedScrollView
替换为单个 ReyclerView
with multiple item types并将所有可滚动内容放入其中。如果您需要 View 回收,这是要走的路。
请注意,您还必须将 NestedScrollView
中的所有其他内容(页眉和页脚、间距)转换为具有自己的 ViewHolders
RecyclerView
项目。
如果设置相当简单,我建议您按照上面的链接在没有其他库的情况下实现它。
有几个不同的库可用于解决您的问题(所有库都遵循第二种方法,使用单个 RecyclerView
),但大多数都带有许多您可能不需要的额外功能:
它带有一个 ViewRenderer
/ViewModel
interface ,这就像一个单个项目类型的“部分”RecyclerView。你会创造一个针对每种项目类型,然后将它们注册到单个适配器中。
由 airbnb 创建并在其应用程序中大量使用的库/框架。 他们有很多可滚动的内容(类似于网页) 许多不同的项目类型。环氧树脂还有助于组成 页面上的不同项目,并在 内容或其顺序发生变化。如果您只需要一个屏幕就太多了。
由 Facebook 创建的完整 UI 框架,带有自己的渲染引擎,可替代 xml 布局等。据我了解,它允许您处理大量项目(如 Facebook 时间线),并且 View 回收是自动处理的。与 Epoxy 一样,只有当您的应用包含无限滚动和大量不同项目类型并且您确实需要这种性能时,您才会使用它。
我尝试了 Epoxy 和 RendererRecyclerViewAdapter,但毕竟我创建了自己的多项目类型适配器。它可以用不到 100 行代码创建。
关于android - 将 RecyclerView 放在 NestedScrollView 中,为所有项目调用 onBindView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50655664/
我想知道如何更有效地重用一些代码来显示一个适合 getView()[BaseAdapter]、onBindView() [RecyclerView] 或 onCreateView() [Fragmen
@Override public void onBindViewHolder(CustomViewHolder holder, int position) { Chapter
在滚动 RecyclerView 时,TextView 中的数据会发生变化,即使数组 logtime.get(i).getTime() 中的数据也会发生变化> 不会改变。只有当我们将数据放入动态生成的
我使用 notifyItemRemoved() 方法我想更改其他剩余项目,但该方法不会触发 onBindView() 方法。 除了使用 notifyDataSetChanged() 之外,我该怎么做。
没有出现任何错误,所有数据似乎都有效。出于某种原因,正在调用与 View 相关的方法。我已经确定了以下几点: getItemCount() 是唯一被调用的适配器方法,它返回一个正整数值,(我知道这将是
我遇到了一个奇怪的错误,如果 getItemCount 返回 1(数据结构的大小),适配器不会显示任何卡片。 我的适配器代码 - public class SingleAdapter extends
Preference 中的onCreateView 和onBindView 方法有什么区别? 在文档中它说onBindView: Binds the created View to the data
在 RecyclerView.Adapter 中使用以下代码: onBindViewHolder(VH holder, int position){ holder.itemView.setAlp
我有两个 RecyclerViews 垂直放置在 LinearLayout 中。我需要使它们都可滚动,这就是为什么我将 LinearLayout 放在 NestedScrollView 中的原因 这是
我从 firebase 获取数据,并将其填充到 userMessageList.adapter 中,并收到通知,并且 getItemCount 显示正确的计数,但 onBindViewHolder 仅
我是一名优秀的程序员,十分优秀!