Задать вопрос

Как повесить обработчик нажатия на элемент RecyclerView?

Всем привет, у меня есть NavigationDraweerActivity в которой выводиться Фрагмент с ViewPager, в котором я вывожу фрагмент с recycler view + card view. В адаптере для recyclerView у viewholder'а есть метод onClick, в самом адаптере реализован интерфейс OnItemClickListener с методом onItemClick. Также у адаптера есть метод SetOnItemClickListener, чтобы повесить обработчик на cardview.
class myViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private CardView cv;
        private ImageView commandImageView;
        private TextView commandTextView;

        public myViewHolder(View itemView) {
            super(itemView);
            cv = itemView.findViewById(R.id.cv);
            commandImageView = itemView.findViewById(R.id.commandImageView);
            commandTextView = itemView.findViewById(R.id.commandTextView);

            cv.setOnClickListener(this);
        }
        @Override
        public void onClick(View v) {
            if (mItemClickListener != null) {
                mItemClickListener.onItemClick(v, getAdapterPosition());
            }
        }
    }
public interface OnItemClickListener {
        public void onItemClick(View view , int position);
    }
    public void SetOnItemClickListener(final OnItemClickListener mItemClickListener) {
        this.mItemClickListener = mItemClickListener;
    }


В коде, когда я создаю recyclerVIew и адаптер для него, я реализую метод onClick
recyclerView = view.findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

        recViewAdapter = new RecViewAdapter(get_data(), getContext());
        recyclerView.setAdapter(recViewAdapter);

        recViewAdapter.SetOnItemClickListener(new RecViewAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                //Мое действие
            }
        });


Но из-за особенности view pager (он создает текущую страницу и следующую) при создании следующей страницы переопределяется обработчик для текущей страницы. Как я понял, это потому что элементы PageVIew ссылаются на один и тот же recycler view. Как это можно исправить?
  • Вопрос задан
  • 6592 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
@klim76
android/java/sql
public class TransportAdapter extends RecyclerView.Adapter<TransportAdapter.TransportViewHolder> {

    public interface onClickListener{
        void onVariantClick(TransportModel model);
    }
    
    private onClickListener listener;
   
   .....
    @Override
    public void onBindViewHolder(@NonNull TransportViewHolder holder, int position) {
        final TransportModel transportModel = transportVariants.get(position);
        ....
        if(listener != null){
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    listener.onVariantClick(transportModel);
                }
            });
        }
    }
   .... бла бла бла

    public void setListener(onClickListener listener){
        this.listener = listener;
    }

    class TransportViewHolder extends RecyclerView.ViewHolder {
       .....бла бла бла
        public TransportViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Ivan0206
Как то сложно ты делаешь.
Тебе надо обрабатывать нажатие card view?
Если да, то имплементируешь OnClickListener
реализуешь метод OnClick в экземпляре RecyclerView.ViewHolder и ловишь нажатие card view через его id.
Соответственно в конструкторе Холдера инициализируешь сам card view
Ответ написан
Ваш ответ на вопрос

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

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