Здравствуйте!
Использую 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);
}
}
});
}