Адаптер RecyclerView дважды запускал notifyItemChanged

#java #android #android-recyclerview

#java #Android #android-recyclerview

Вопрос:

Я пытаюсь выделить выбранный элемент в RecyclerView при нажатии на него.Но вместо этого он запускает два элемента. Пожалуйста, помогите мне. Должен ли я сохранять выбранные элементы как arraylist и очищать их при новом нажатии?

 public class StationsAdapter extends RecyclerView.Adapter<StationsHolder> {

List<Station> stations;

public StationsAdapter(List<Station> stations){
    this.stations = stations;
}

public void changeItemAtPosition(int position) {
    notifyItemChanged(position);
}

@Override
public StationsHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new StationsHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.stations_item,parent,false));
}

@Override
public void onBindViewHolder(StationsHolder holder, int position) {
    bind(holder);
}

private void bind(final StationsHolder holder) {

    holder.tvTitle.setText(stations.get(holder.getAdapterPosition()).getName());
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.tvTitle.setTextColor(ContextCompat.getColor(AppDelegate.getContext(),R.color.colorAccent));
        }
    });
}

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

}

Комментарии:

1. зачем вам нужно вызывать notifyItemChanged, если вы только меняете цвет, и вы уже делаете это в методе setOnClickListener?

2. @zon7 в любом случае, он меняет цвета двух элементов: (

3. два элемента при прокрутке, не так ли? Это потому, что он повторно использует представление. При динамическом изменении параметров вида, таких как color, необходимо сбросить их. Я добавлю ответ

Ответ №1:

Это связано с тем, что recycler повторно использует один и тот же вид при прокрутке. Чтобы исправить это, вам нужно будет выполнить следующее:

  1. Сохраняйте выбранный элемент при нажатии на него. В переменной или в массиве, если требуется более одного элемента
  2. Проверьте выбранную переменную элемента / массив в методе bind, чтобы узнать, нужно ли ее раскрашивать или нет

Таким образом, он будет работать безупречно