Почему OnClickListener в ViewHolder не работает?
Я пытаюсь реализовать способ обработки выбора элемента на RecyclerView
. Мне лично не нравится способ, предложенный в некоторых ответах на SO о проходящих через жесты, и я думал, что реализация OnClickListener
, как предложено здесь и здесь, было очищено.
Дело в том, что... этот шаблон на самом деле не работает! Я действительно не могу понять, почему мой OnClickListener.onClick
называется никогда. Это похоже на другой метод, который перехватывает щелчок, прежде чем onClick
сможет позаботиться об этом.
Это мой код:
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView tvName;
ImageView star;
public ViewHolder(View itemView) {
super(itemView);
tvName = (TextView) itemView.findViewById(R.id.CHAT_ITEM_name);
star = (ImageView) itemView.findViewById(R.id.CHAT_ITEM_star);
Fonts.setTypeface(tvName, regular);
}
@Override
public void onClick(View view) {
int position = getLayoutPosition();
select(position);
}
}
К сожалению, для меня очень важно иметь доступ к позиции щелкнутого элемента во всем наборе данных, чтобы удалить его, поэтому делать что-то вроде indexOfChild
тоже не приемлемо: я пробовал, но этот метод дает вы позиционируете элемент в видимой части списка, что делает невозможным list.remove(position)
.
Ответы
Ответ 1
Глядя на обновленный код: вы не устанавливаете onClickListener ни одно из представлений в ViewHolder. Это понятная ошибка, чтобы забыть прослушивателя кликов.
Просто используйте:
tvName.setOnClickListener(this);
star.setOnClickListener(this);
Вы можете установить оба или только один из них. Вы также можете просто получить родительский макет этих двух представлений, чтобы весь элемент в адаптере можно было кликать.
itemView.setOnClickListener(this);
Ответ 2
Вы можете сделать это в своем onBindViewHolder
@Override
public void onBindViewHolder(ReportViewHolder holder, int position {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// handle your click here.
} });
}