azerphoenix
@azerphoenix
Java Software Engineer

Как устранить некорректное отображение избранных элементов в recyclerview?

Доброго времени суток!

Ниже указан код, который я использую для добавления или удаления из избраного

imageButton = (ImageButton) findViewById(R.id.favorite_button);
//                if(db.isFavorite(valueOf(medicationList.get(position).get_id())))
//                    imageButton.setImageResource(R.drawable.ic_add_to_fav);

                // Ловим клик по кнопке "Добавить в избранное"
                holder.itemView.findViewById(R.id.favorite_button).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        if(!db.isFavorite(valueOf(medicationList.get(position).get_id()))) {
                            db.addToFavorites(valueOf(medicationList.get(position).get_id()));
                            imageButton.setImageResource(R.drawable.ic_add_to_fav);
                            
                        } else {
                            db.removeFromFavorites(valueOf(medicationList.get(position).get_id()));
                            imageButton.setImageResource(R.drawable.ic_remove_from_fav);
                            
                        }

                    }
                });


Сама функция записи и удаления ид выбранного элемента в БД отрабатывает корректно, но проблема с ImageButton. Независимо, от того какой элемент был выбран всегда кнопка выделяется "избранной" только для первого элемента)))))

Пробовал, как medicationList.get(position).get_id()так и
medicationList.get(holder.getAdapterPosition()).get_id()


В чем моя ошибка? Почему выделяется всегда только один и тот же элемент вместо выбранного. (Повторюсь, что сам выбранный элемент добавляется в БД корректно)

И еще попутный вопрос:
имеется небольшая строка кода, которая по идее, должна в методе onCreate отметить все элементы, которые являются избранными.
//                if(db.isFavorite(valueOf(medicationList.get(position).get_id())))
//                    imageButton.setImageResource(R.drawable.ic_add_to_fav);

Но тоже как-то не отрабатывает(

Буду признателен за помощь или за подсказку
  • Вопрос задан
  • 229 просмотров
Решения вопроса 1
orcDamnar
@orcDamnar
Java, C/C++, Android SDK
хм, ребята, не работайте с установкой onClickListener в onBindViewHolder это раз. Во вторых, если уж хотите работать - выносите его в холдер, а данные, по которым должен работать клик меняйте просто в onBindViewHolder. В третьих, холдер предназначен для того, в том числе, чтобы единожды в конструкторе найти все значимые поля и связать их с версткой, а не вызывать каждый раз в onBindViewHodler findViewById. Не нужно работать в RecyclerView с позицией. Нужно работать с данными в холдере.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@YuryBorodkin
Android dev
хм, я бы посоветовал вам изучить как анонимные классы захватывают переменные - например тут.
причина ошибки - вы ипользуете position, которые передается параметром метода onBindViewHolder. тут стоит использовать holder.getAdapterPosition() внутри анонимного класса-обработчика нажатия.
Ответ написан
@davidnum95
notifyDataSetChanged или notifyItemChanged ?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы