azerphoenix
@azerphoenix
Java Software Engineer

Как устранить возможную ошибку в recyclerview после обновления списка?

Здравствуйте!
Использую RecyclerView & Material SearchView для реализации поиска.
Гит - https://github.com/MiguelCatalan/MaterialSearchView
Поиск в общем-то работает, но есть одна ошибка.
При клике на первый найденный результат (на первый пункт), открывается первый элемент списка, а не первый элемент результата поиска... А дальше, как бы при клике на следующие элементы, открываются -1 элементы. Т.е. при клике на второй элемент, открывается первый, на третьем --> второй и т.д. В чем может быть ошибка?
Подозреваю, что дело в position, хотя я использую getAdapterPosition();

Мой адаптер:

Метод onBindViewHolder
public void onBindViewHolder(MedicationsViewHolder holder, int position) {
        holder.bind(medicationList.get(holder.getAdapterPosition()));
}

Метод onCreateViewHolder
public MedicationsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view = layoutInflater.inflate(R.layout.medication_item, parent, false);
        return new MedicationsViewHolder(view);
    }


ViewHolder
public class MedicationsViewHolder extends RecyclerView.ViewHolder {
        public TextView tradeNameText;
        public ImageButton imageButton;

        public MedicationsViewHolder(final View itemView) {
            super(itemView);
            tradeNameText = itemView.findViewById(R.id.medication_trade_name);
            imageButton = itemView.findViewById(R.id.favorite_button);
        }
        public void bind(Medication medication) {
            tradeNameText.setText(medication.get_tradeName());
            imageButton.setImageResource(R.drawable.ic_remove_from_fav);
        }

}


Метод для поиска:
public void setFilter(List<Medication> newList) {
        medicationList = new ArrayList<Medication>();
        medicationList.addAll(newList);
        notifyDataSetChanged();
    }


Метод сквозного поиска:
public boolean onQueryTextChange(String newText) {
                if (newText != null && !newText.isEmpty()) {
                    List<Medication> newList = new ArrayList<Medication>();
                    newText = newText.toLowerCase();

                    for (Medication medication : medicationList) {
                        String tradeName = medication.get_tradeName().toLowerCase();
                        if (tradeName.contains(newText)) {
                            newList.add(medication);
                        }
                    }
                    medicationsAdapter.setFilter(newList);

               }  else {
                    medicationsAdapter = new MedicationsAdapter(medicationList, MainActivity.this);
                    recyclerView.setAdapter(medicationsAdapter);

                }
                return true;
            }


Реализация клика:
// Слушатель для элементов recyclerView
        recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), recyclerView, new RecyclerTouchListener.ClickListener() {

            // Ловик клик при надобности
            @Override
            public void onClick(final View view, int position) {
                final RecyclerView.ViewHolder holder = recyclerView.findContainingViewHolder(view);


                // Ловим клик по препарату
                holder.itemView.findViewById(R.id.medication_trade_name).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent descriptionIntent = new Intent(MainActivity.this, DescriptionActivity.class);
                        descriptionIntent.putExtra("Medication", medicationList.get(holder.getAdapterPosition()));
                        startActivity(descriptionIntent);
                    }
                });

                final ImageButton imageButton = holder.itemView.findViewById(R.id.favorite_button);
                // Ловим клик по кнопке "Добавить в избранное"
                holder.itemView.findViewById(R.id.favorite_button).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if(!db.isFavorite(valueOf(medicationList.get(holder.getAdapterPosition()).get_id()))) {
                            db.addToFavorites(valueOf(medicationList.get(holder.getAdapterPosition()).get_id()));
                            imageButton.setImageResource(R.drawable.ic_add_to_fav);
                        } else {
                            db.removeFromFavorites(valueOf(medicationList.get(holder.getAdapterPosition()).get_id()));
                            imageButton.setImageResource(R.drawable.ic_remove_from_fav);
                        }

                    }
                });

            }
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
azerphoenix
@azerphoenix Автор вопроса
Java Software Engineer
Денис Загаевский жаль, что не могу выбрать ваш комментарий, в качестве ответа, но он действительно мне помог. Проблема заключалась в слушателе.
Несмотря на то, что клик работал, но при поиске из-за обновления списка и смены позиции, клик отрабатывал некорректно.

Перекинул это в метод onBindViewHolder()
// Ловим клик по препарату
        holder.itemView.findViewById(R.id.medication_trade_name).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent descriptionIntent = new Intent(mContext, DescriptionActivity.class);
                descriptionIntent.putExtra("Medication", medicationList.get(holder.getAdapterPosition()));
                mContext.startActivity(descriptionIntent);
            }
        });

        final ImageButton imageButton = holder.itemView.findViewById(R.id.favorite_button);
        // Ловим клик по кнопке "Добавить в избранное"
        holder.itemView.findViewById(R.id.favorite_button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!db.isFavorite(valueOf(medicationList.get(holder.getAdapterPosition()).get_id()))) {
                    db.addToFavorites(valueOf(medicationList.get(holder.getAdapterPosition()).get_id()));
                    imageButton.setImageResource(R.drawable.ic_add_to_fav);
                } else {
                    db.removeFromFavorites(valueOf(medicationList.get(holder.getAdapterPosition()).get_id()));
                    imageButton.setImageResource(R.drawable.ic_remove_from_fav);
                }

            }
        });


Cответственно, удалил его из MainActivity. Теперь и клик в поиске и клик в самом списке работают правильно. Не скажу насколько чисто получилось с точки зрения программирования, так как я пока только изучаю)) Но зато нет даблкликов)))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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