Nil*_*bja 15 android recycler-adapter android-recyclerview
我正在开发一个应用程序,我正在尝试使用RecyclerView和recycler适配器填充列表.但是当我快速滚动列表时,有时列表项中的值会在列表项之间进行洗牌.这有一个已知的解决方案吗?
Nil*_*bja 39
在适配器中添加这个解决了问题
@Override
public int getItemViewType(int position)
{
return position;
}
Run Code Online (Sandbox Code Playgroud)
SHU*_*WAR 13
只需在适配器类中覆盖这些方法:
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
Run Code Online (Sandbox Code Playgroud)
此链接将帮助您了解背后的概念.
只需要在您的 Adapter 中覆盖两个方法,它就会解决您的问题。
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
Run Code Online (Sandbox Code Playgroud)
注意:我强烈建议不要使用任何建议对所有列表项使用唯一视图类型的解决方案,通过覆盖将位置编号分配给视图类型getItemViewType()。这样做将使 RecyclerView 认为列表中的所有项目都具有不同类型的布局,因此每个项目将从头开始单独创建。这将导致应用程序的主内存使用量增加,以及包含 RecyclerView 的 Activity 或片段的加载时间。
由于项目的 ViewHolder 未在 内正确更新,项目正在被打乱onBindViewHolder()。要了解为什么会发生这种行为,首先让我们了解 RecyclerView 究竟是如何回收列表项的。
默认情况下,RecyclerView 将仅创建可在设备屏幕上显示的项目数。这意味着,即使列表中有数百或数千个列表项,如果设备一次只能在屏幕上显示 10 个项目,则大约只会创建 10 个项目并将其存储在主存储器 (RAM) 中。当屏幕滚动时,这10个项目将更新为新内容,而不是再次创建项目及其布局。在下图中,您可以看到仅通过将文本从 ABC 更新为 XYZ 即可回收第一项。前一项的背景色红色保持不变。
图片来源:Google Codelabs
更具体地说,在滚动时,RecyclerView 将使用相同的滚动项的 ViewHolder 并使用即将到来的新列表项的属性来更新它,而不是垃圾收集滚动项的 ViewHolder 并创建一个新的 ViewHolder。(ViewHolder 是保存特定列表项的视图以及描述它的属性的东西)
此更新处理是通过重写onBindViewHolder()每当需要在屏幕上显示新项目时调用的方法来完成的。列表中的值随机排列的原因与 ViewHolder 在该方法内的更新方式有关。正如我之前所说,由于列表项在滚动列表时被回收,因此您作为参数获取的 ViewHolderonBindViewHolder() 将已经分配有其他列表项的属性。因此,您需要确保此 ViewHolder 的所有属性要么根据新列表项的属性进行替换,要么重置回默认值。为此,请检查您是否在此方法中使用了任何条件,并确保向其中添加了一个默认条件,该条件会将特定视图的属性重置为默认值。
例子:-
if (<CONDITION>) {
holder.textView.setText("New Text")
} else {
// RESET. Missing to reset the text would lead to the issue.
holder.textView.setText("Default Text")
}
Run Code Online (Sandbox Code Playgroud)
如果您仍然没有清楚地了解 RecyclerView 的工作原理,那么我建议您浏览Google 的RecyclerView 基础代码实验室。在此 Codelab 中,他们在第一个任务的第 6 步中专门解决了这个回收问题。
| 归档时间: |
|
| 查看次数: |
8684 次 |
| 最近记录: |