首页 > 解决方案 > Recyclerview 项目按钮动画发生在多个项目上

问题描述

所以我有一个非常简单的回收站视图。和一个应用按钮。当它按下按钮时,文本变为橙色。但是当我向下滚动时,我看到还有其他项目的应用按钮颜色也已更改。

有谁知道发生了什么?这里有一些代码片段。

public void apply(View view){
    Button b = (Button)view;
    b.setTextColor(ColorEx.TUTOR_BEAR_LOGO_ORANGE);
}

这就是在主要活动中执行的方法。这是不同布局的按钮 xml。(项目布局)

  <Button
    android:id="@+id/btn_apply"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="APPLY"
    android:onClick="apply"
  />

这是我的适配器类

public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder> {

Context context;
ArrayList<String> title;

public Adapter(Context context, ArrayList<String> title) {
    this.context = context;
    this.title = title;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(context);
    View view = inflater.inflate(R.layout.item_sample,parent,false);
    MyViewHolder  holder = new MyViewHolder(view);
    return  holder;
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    switch (position){
        case 0:
        case 3:
        case 6:
            holder.imageView.setImageResource(R.drawable.x);
            break;
        case 1:
        case 4:
        case 7:
            holder.imageView.setImageResource( R.drawable.y);
            break;
        case 2:
        case 5:
            holder.imageView.setImageResource(R.drawable.z);
            break;
        case 8:
            holder.imageView.setImageResource(R.drawable.z);
            break;
    }
}

@Override
public int getItemCount() {
    return title.size();
}



class MyViewHolder extends RecyclerView.ViewHolder{
    ImageView imageView;
    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        imageView = itemView.findViewById(R.id.imageView);
    }
}

}

我屏幕记录了该事件并将其上传为 .gif 以便更好地参考。这是下面的链接。 https://media.giphy.com/media/jOagjkf9dmW5Kvrqyn/giphy.gif

标签: androidandroid-layoutandroid-recyclerview

解决方案


您必须保存被点击的项目位置

public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder> {

    Context context;
    ArrayList<String> title;
    Set<Integer> itemClicked;

    public Adapter(Context context, ArrayList<String> title) {
        this.context = context;
        this.title = title;
        this.itemClicked = new HashSet<>();
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.item_sample, parent, false);
        MyViewHolder holder = new MyViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
        switch (position) {
            case 0:
            case 3:
            case 6:
                holder.imageView.setImageResource(R.drawable.x);
                break;
            case 1:
            case 4:
            case 7:
                holder.imageView.setImageResource(R.drawable.y);
                break;
            case 2:
            case 5:
                holder.imageView.setImageResource(R.drawable.z);
                break;
            case 8:
                holder.imageView.setImageResource(R.drawable.z);
                break;
        }

        if (itemClicked.contains(position)) {
            holder.button.setTextColor(ColorEx.TUTOR_BEAR_LOGO_ORANGE);
        } else {
            holder.button.setTextColor(ColorEx.BLACK);
        }

        holder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (itemClicked.contains(position)) {
                    itemClicked.remove(position);
                } else {
                    itemClicked.add(position);
                }
                notifyItemChanged(position);
            }
        });
    }

    @Override
    public int getItemCount() {
        return title.size();
    }


    class MyViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;
        Button button;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.imageView);
            button = itemView.findViewById(R.id.btn_apply);
        }
    }
}

推荐阅读