Изменение макета элемента в recyclerview по щелчку мыши не работает в Android

#java #android #android-studio #android-recyclerview #onclicklistener

Вопрос:

Я пытаюсь сделать выбор цвета с помощью recyclerview. Однако, хотя OnClickListener работает, просмотр вторичной переработки впоследствии не обновляется, и внешний вид выбранного цвета не меняется должным образом. Однако список массивов, в котором сохраняется состояние, изменяется, как и ожидалось, и выводится в виде тоста.

Моя деятельность выглядит так:

 public class NewDetailGeneral extends AppCompatActivity implements ColorChooserAdapter.onColorClickListener {

    ColorChooserAdapter colorChooserAdapter;
    ArrayList<Integer> colorArrayList, colorChosenArrayList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new_detail_general);

        RecyclerView colorChooserRV = findViewById(R.id.colorChooserRV);
        //colorChooserRV.setNestedScrollingEnabled(false);

        colorArrayList = new ArrayList<>();
        colorArrayList.add(R.color.black);
        colorArrayList.add(R.color.dark_grey);
        colorArrayList.add(R.color.pink);
        colorArrayList.add(R.color.purple);
        colorArrayList.add(R.color.blue);
        colorArrayList.add(R.color.aqua);
        colorArrayList.add(R.color.green);
        colorArrayList.add(R.color.yellow);
        colorArrayList.add(R.color.orange);
        colorArrayList.add(R.color.red);

        colorChosenArrayList = new ArrayList<>();
        for (int i=0; i<colorArrayList.size();i  ) {
            colorChosenArrayList.add(i, 0);
        }

        colorChooserAdapter = new ColorChooserAdapter(this, colorArrayList, colorChosenArrayList, NewDetailGeneral.this);
        colorChooserRV.setAdapter(colorChooserAdapter);
        colorChooserRV.setLayoutManager(new GridLayoutManager(this, 5));
    }

    @Override
    public void onColorClickListener(int position) {
        for (int i=0;i<colorChosenArrayList.size();i  ) {
            if (colorChosenArrayList.get(i)==1){
                colorChosenArrayList.set(i, 0);
                //colorChooserAdapter.notifyItemChanged(i);
            }
        }
        colorChosenArrayList.set(position, 1);
        //colorChooserAdapter.notifyItemChanged(position);
        Toast.makeText(NewDetailGeneral.this, colorChosenArrayList.toString(), Toast.LENGTH_SHORT).show();

    }
}
 

И мой класс адаптера-это один:

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

    private Context context;
    private ArrayList colorArrayList, colorChosenArrayList;
    private ColorChooserAdapter.onColorClickListener onColorClickListener;

    ColorChooserAdapter(Context context, ArrayList colorArrayList, ArrayList colorChosenArrayList, ColorChooserAdapter.onColorClickListener onColorClickListener) {
        this.context = context;
        this.colorArrayList = colorArrayList;
        this.colorChosenArrayList = colorChosenArrayList;
        this.onColorClickListener = onColorClickListener;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ColorChooserAdapter.MyViewHolder holder, int position) {

        if (colorChosenArrayList.get(position).equals(1)) {
            DrawableCompat.setTint(holder.colorChooserButtonIV.getDrawable(), ContextCompat.getColor(context, R.color.light_grey));
        } else {
            DrawableCompat.setTint(holder.colorChooserButtonIV.getDrawable(), ContextCompat.getColor(context, (Integer) colorArrayList.get(position)));
        }
    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        ImageView colorChooserButtonIV;
        ColorChooserAdapter.onColorClickListener onColorClickListener;

        public MyViewHolder(@NonNull View itemView, ColorChooserAdapter.onColorClickListener onColorClickListener) {
            super(itemView);
            colorChooserButtonIV = itemView.findViewById(R.id.colorChooserButtonIV);
            this.onColorClickListener = onColorClickListener;
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            onColorClickListener.onColorClickListener(getAdapterPosition());
        }
    }

    public interface onColorClickListener{
        void onColorClickListener(int position);
    }
 }
 

Чего я не понимаю, так это того, что у меня почти точно такой же класс, в котором я могу выбрать более одного значка (есть значки, а не цвета), и он работает безупречно, но здесь это не так.
Как вы можете видеть, я уже пробовал использовать notifyItemChanged в разных позициях, но это совсем не работает. Чем какой-то цвет серый, но он больше не меняется или меняется один раз, но затем три щелчка не и так далее…

Я надеюсь, что вы, ребята, сможете мне помочь!

Спасибо,

селдри