This is the project我正在尝试运行。这是我的RecyclerView.Adapter类中的onBindViewHolder的代码
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
TextView title = (TextView) holder.view.findViewById(R.id.title);
final TextView desc = (TextView) holder.view.findViewById(R.id.desc);
final ImageView imageView = (ImageView) holder.view.findViewById(R.id.imageView);
title.setText(pojos.get(position).getTitle());
desc.setText(pojos.get(position).getDesc());
imageView.setImageResource(pojos.get(position).getImage());
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
desc.setText("clicked");
desc.setBackgroundColor(Color.BLUE);
imageView.setImageResource(R.drawable.heart_red);
}
});
}
列表加载正常,调用imageView的onclicklistener时会发生问题。
desc.setText("clicked");
上面的行在单击它的列表项中进行更改。但
desc.setBackgroundColor(Color.BLUE);
执行此行时,更改将反射(reflect)在列表中的多个项目中。怎么了?在下面显示的图片中,我单击了项目0,文本更改为“已单击”并设置了颜色。但是,当我向下滚动时,单击项目0也会影响项目12。仅反射(reflect)了背景颜色变化,而没有反射(reflect)文本变化。如何停止呢?
我已经尝试解决了很长时间,请下载项目并尝试执行代码以了解我的确切意思(如果我的问题不清楚)。
最佳答案
发生这种情况是因为 View 被回收和重用。
因此,当 View 被回收时,如果您不再更改它们,它将保留“旧” View 的属性。因此,当您向下滚动到数字12时,用于保留数字1的 View 将被回收(因为不再可以在屏幕上看到它),并用于创建数字12。这就是为什么蓝色在数字上的原因12
例如,当单击该项目时,您需要将“clicked”值保存到POJO对象中。然后,在绘制项目时,检查该值并根据该值设置正确的图像/背景色。
我已经在下面的代码中完成了此操作,因此它应该使您大致了解该怎么做:
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
TextView title = (TextView) holder.view.findViewById(R.id.title);
final TextView desc = (TextView) holder.view.findViewById(R.id.desc);
final ImageView imageView = (ImageView) holder.view.findViewById(R.id.imageView);
final MyPojo pojo = pojos.get(position);
title.setText(pojo.getTitle());
if(!pojo.clicked) {
desc.setText(pojo.getDesc());
imageView.setImageResource(pojo.getImage());
desc.setBackgroundColor(Color.argb(0,0,0,0));
} else {
desc.setText("clicked");
desc.setBackgroundColor(Color.BLUE);
imageView.setImageResource(R.drawable.heart_red);
}
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
pojo.clicked = true;
desc.setText("clicked");
desc.setBackgroundColor(Color.BLUE);
imageView.setImageResource(R.drawable.heart_red);
}
});
}
并且我在MyPojo类中添加了一个“单击的” bool 值。
public class MyPojo {
String title;
String desc;
int image;
boolean clicked;
}