#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 в разных позициях, но это совсем не работает. Чем какой-то цвет серый, но он больше не меняется или меняется один раз, но затем три щелчка не и так далее…
Я надеюсь, что вы, ребята, сможете мне помочь!
Спасибо,
селдри