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;
 }

09-10 09:17
查看更多