滚动太快时 RecyclerView 适配器数据显示错误
RecycleView adapter data show wrong when scrolling too fast
我有一个列出我的项目的自定义回收视图适配器。在每个项目中,我检查数据库并绘制一些带颜色的圆圈。
当我快速滚动列表视图时,每个绘制的数据(不是标题和文本)都显示错误!
如何在不显示错误数据的情况下管理动态视图创建?!
@Override
public void onBindViewHolder(final ItemViewHolder itemViewHolder, int i) {
itemViewHolder.date.setText(items.get(i).getData()); // set the title
itemViewHolder.relative_layout_tag_place.addView(generateTagImages(items.get(i).getServerId())); // had to generate a Relativelaout with
}
这是 importMenuTags():
private RelativeLayout generateTagImages(String serverId) {
List<String> color_list = new ArrayList<>();
RelativeLayout result = new RelativeLayout(context);
List<String> list = db.getCardTags(serverId);
int i = 0;
for (String string : list) {
RelativeLayout rl = new RelativeLayout(context);
color_list.add(get_the_proper_color);
Drawable drawable = context.getResources().getDrawable(R.drawable.color_shape);
drawable.setColorFilter(Color.parseColor(dao.getTagColor(string)), PorterDuff.Mode.SRC_ATOP);
RelativeLayout.LayoutParams lparams = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lparams.addRule(RelativeLayout.ALIGN_PARENT_START);
lparams.setMargins(i, 0, 0, 0);
lparams.width = 35;
lparams.height = 35;
rl.setLayoutParams(lparams);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
rl.setBackground(drawable);
} else {
rl.setBackgroundDrawable(drawable);
}
result.addView(rl);
i = i + 25;
}
return result;
}
我在简单的自定义适配器中也遇到了同样的问题,通过将我的函数位置移出
解决了这个问题
if (convertView == null) {
这是 link.
根据您的代码,我发现您的相对布局在滚动时一定会显示一些额外的数据。那是因为视图的回收。这里
public void onBindViewHolder(final ItemViewHolder itemViewHolder, int i) {
itemViewHolder.date.setText(items.get(i).getData()); // set the title
itemViewHolder.relative_layout_tag_place.addView(generateTagImages(items.get(i).getServerId())); // had to generate a Relativelaout with
//Problem is here.
假设你在上面 holde.relative_layout 添加了一些子视图,并且这个 ViewHodler 是 recyclerd 并提供给另一个项目视图,它已经包含了之前添加的所有视图。并且您正在为他们添加新的子视图。希望你明白你的问题。
解决方案:非常简单。删除 onBindViewHolder
中所有预先添加的视图
public void onBindViewHolder(final ItemViewHolder itemViewHolder, int i) {
itemViewHolder.date.setText(items.get(i).getData()); // set the title
itemViewHolder.relative_layout_tag_place.removeAllViews();
itemViewHolder.relative_layout_tag_place.addView(generateTagImages(items.get(i).getServerId())); // had to generate a Relativelaout with
我在 3 天后找到了这个解决方案...希望它对你有用。
我遇到了同样的问题,为此我找到的唯一解决方案是:
holder.setIsRecyclable(false);
您的回收站将不再回收,因此滚动时项目将相同,如果您想删除某些项目,请不要使用 notifyitemRemoved(position),使用 notifyDataSetChanged() 代替。
我有一个列出我的项目的自定义回收视图适配器。在每个项目中,我检查数据库并绘制一些带颜色的圆圈。
当我快速滚动列表视图时,每个绘制的数据(不是标题和文本)都显示错误! 如何在不显示错误数据的情况下管理动态视图创建?!
@Override
public void onBindViewHolder(final ItemViewHolder itemViewHolder, int i) {
itemViewHolder.date.setText(items.get(i).getData()); // set the title
itemViewHolder.relative_layout_tag_place.addView(generateTagImages(items.get(i).getServerId())); // had to generate a Relativelaout with
}
这是 importMenuTags():
private RelativeLayout generateTagImages(String serverId) {
List<String> color_list = new ArrayList<>();
RelativeLayout result = new RelativeLayout(context);
List<String> list = db.getCardTags(serverId);
int i = 0;
for (String string : list) {
RelativeLayout rl = new RelativeLayout(context);
color_list.add(get_the_proper_color);
Drawable drawable = context.getResources().getDrawable(R.drawable.color_shape);
drawable.setColorFilter(Color.parseColor(dao.getTagColor(string)), PorterDuff.Mode.SRC_ATOP);
RelativeLayout.LayoutParams lparams = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lparams.addRule(RelativeLayout.ALIGN_PARENT_START);
lparams.setMargins(i, 0, 0, 0);
lparams.width = 35;
lparams.height = 35;
rl.setLayoutParams(lparams);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
rl.setBackground(drawable);
} else {
rl.setBackgroundDrawable(drawable);
}
result.addView(rl);
i = i + 25;
}
return result;
}
我在简单的自定义适配器中也遇到了同样的问题,通过将我的函数位置移出
解决了这个问题if (convertView == null) {
这是 link.
根据您的代码,我发现您的相对布局在滚动时一定会显示一些额外的数据。那是因为视图的回收。这里
public void onBindViewHolder(final ItemViewHolder itemViewHolder, int i) {
itemViewHolder.date.setText(items.get(i).getData()); // set the title
itemViewHolder.relative_layout_tag_place.addView(generateTagImages(items.get(i).getServerId())); // had to generate a Relativelaout with
//Problem is here.
假设你在上面 holde.relative_layout 添加了一些子视图,并且这个 ViewHodler 是 recyclerd 并提供给另一个项目视图,它已经包含了之前添加的所有视图。并且您正在为他们添加新的子视图。希望你明白你的问题。
解决方案:非常简单。删除 onBindViewHolder
中所有预先添加的视图 public void onBindViewHolder(final ItemViewHolder itemViewHolder, int i) {
itemViewHolder.date.setText(items.get(i).getData()); // set the title
itemViewHolder.relative_layout_tag_place.removeAllViews();
itemViewHolder.relative_layout_tag_place.addView(generateTagImages(items.get(i).getServerId())); // had to generate a Relativelaout with
我在 3 天后找到了这个解决方案...希望它对你有用。
我遇到了同样的问题,为此我找到的唯一解决方案是:
holder.setIsRecyclable(false);
您的回收站将不再回收,因此滚动时项目将相同,如果您想删除某些项目,请不要使用 notifyitemRemoved(position),使用 notifyDataSetChanged() 代替。