Почему 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. 
    } }); 
}