【发布时间】:2017-06-21 02:58:39
【问题描述】:
我有包含其他 RecyclerViews 的主 RecyclerView(我们称它们为 subRecyclerViews)。 subRecyclerViews 的数量基于从服务器接收到的数据。问题是,每当 subRecyclerView 即将变得可见时,它会立即为其所有项目创建 ViewHolders(而不是仅为可见项目创建 ViewHolders)。
在我调用的 MainRecyclerViewAdapter onBindViewHolder() 方法中
subRecyclerViewAdapter.setData(data);
subRecyclerView.notifyDataSetChanged();
这会导致延迟,因为 subRecyclerView 正在为其所有项目调用 onCreateViewHolder() 和 onBindViewHolder() 方法。
我使用的RecyclerView版本是
com.android.support:recyclerview-v7:25.1.1
问题是,有没有办法告诉 subRecyclerView 它不需要为尚不可见的项目创建 ViewHolders?另外,这是 RecyclerView 中的错误还是我做错了什么?
【问题讨论】:
-
在其他 recyclerView 中使用 recyclerViews 对我来说似乎不是一个好主意。您最终会遇到性能问题(例如您遇到的这种滞后)。请记住,您还可以使用
ListViews 显示列表或使用ScrollViews 启用滚动。 -
@RosárioPereiraFernandes 你能解释一下,为什么使用
ListView会比使用RecyclerView更好?我一直认为,他们添加了RecyclerView,因为它比ListView优化得更好。使用ScrollView可能是一种更好的方法,但有一个问题是在我从服务器接收数据之前,我不知道会有多少个 SubRecyclerView。每个 SubRecyclerView 也可以以不同的方式显示数据,其中一些是网格,一些是水平列表或通常的垂直列表。这也是基于来自服务器的数据。 -
哦,我明白了.. 嗯,RecyclerView 和 ListView 之间的主要区别在于,当您设置 Adapter 时,ListViews 会创建所有视图。但是 RecyclerViews 只有在设置 Adapter 时才会创建可见的 Views;当这些视图不再可见时,它们将被销毁并创建“新可见”。这就是为什么我认为拥有 subRecyclerViews 可能是一个问题:您将同时创建和销毁许多视图。
-
@RosárioPereiraFernandes 我想我知道你的意思,但是因为我的
RecyclerView是一次创建所有视图,这不就像使用ListView一样吗?此外,我认为RecyclerView并没有完全破坏旧视图并为新可见项目创建新视图。据我了解,它只会回收旧视图并将它们重用于新项目。而且由于只有在看到新的 SubRecyclerView 并且同时为所有 SubRecyclerView 项目调用 onCreateViewHolder() 方法时才会出现延迟,所以我认为问题正是它的行为类似于ListView。 -
@Mischmo:你有没有想过这个问题?
标签: android android-recyclerview android-viewholder