2

У меня есть ImageView в CardViews моего RecyclerView. Я хотел бы поймать onClick на ImageView, как я уже делал с ListView. Так, в общественности недействительным onBindViewHolder (держатель RecyclerView.ViewHolder, окончательное ИНТ положение) Я попытался с:RecyclerView: как поймать onClick на ImageView?

myViewHolder.imageView.setClickable(true); 
myViewHolder.imageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Log.d("TEST", "Clicked"); 
      } 

, но это было полностью проигнорировано. Работает следующий код:

myViewHolder.imageView.setImageResource(R.drawable.star_yellow); 

Что я могу сделать?

+0

Можете ли вы разместить свой xm и, возможно, onBindViewHolder и ViewHolder самостоятельно? У меня есть один проект с ImageViews внутри CardView, а onClick работает отлично. – Kistamushken

+0

http://stackoverflow.com/questions/28379302/add-clicklistner-for-button-inside-a-cardview-populated-using-a-recyclerview, если это не работает, разместите свой макет также – Pavan

ответ

13

Вот что я делаю в своем проекте.

  1. Иметь класс интерфейса где-то в вашем проекте:

    public interface RecyclerViewClickListener { 
    
        void onRowClicked(int position); 
        void onViewClicked(View v, int position); 
    } 
    
  2. В классе RecyclerView.Adapter, добавьте этот интерфейс как поле и передать его к адаптеру с помощью конструктора:

    public class YourRecAdapter extends RecyclerView.Adapter<YourRecAdapter.SimpleViewHolder>{ 
    
        private RecyclerViewClickListener listener; 
    
        public YourRecAdapter(RecyclerViewClickListener listener){ 
         this.listener = listener; 
        } 
    
        public static class SimpleViewHolder extends RecyclerView.ViewHolder { 
    
         public SimpleViewHolder(View itemView, final RecyclerViewClickListener listener) { 
          super(itemView); 
    
          // find view ids here 
    
          itemView.setOnClickListener(new View.OnClickListener() { 
           @Override 
           public void onClick(View v) { 
            if(listener != null) 
             listener.onRowClicked(getAdapterPosition()); 
           } 
          }); 
    
          someViewholderView.setOnClickListener(new View.OnClickListener() { 
           @Override 
           public void onClick(View v) { 
            if(listener != null) 
             listener.onViewClicked(v, getAdapterPosition()); 
           } 
          }); 
         } 
        } 
    } 
    
  3. Внедрение интерфейса в вашей деятельности/фрагменте:

    public class YourFragment extends Fragment implements RecyclerViewClickListener { 
    
        @Override 
        public void onViewClicked(View v, int position) { 
         if(v.getId == R.id.yourDesiredView){ 
          // Do your stuff here 
         } 
        } 
    
        @Override 
        public void onRowClicked(int position) { 
         // Clicked entire row 
        } 
    } 
    
+0

Благодарим вас за ответ, но невозможно управлять щелчком в методе onBindViewHolder? – helloimyourmind

+0

Да, просто переместите все мои объекты .setOnClickListener (...) в метод onBindViewHolder(). Затем вам не нужно передавать слушателю конструктор ViewHolder. Тем не менее, я думаю, что немного лучше использовать методы onClick в вашем ViewHolder, иначе они будут воссоздаваться все время при прокрутке списка. –

+0

В MyFragment мне нужно создать новый объект типа RecyclerViewClickListener и передать его как параметр в конструкторе Adapter? – helloimyourmind

0

В вашем классе Viewholder вы можете установить OnClickListener, но вам понадобится другой интерфейс, чтобы передать регистр OnClick обратно на ваш адаптер (или где бы вы ни находились).

+0

Можете ли вы пойти больше в деталь с примером кода? – helloimyourmind

+0

Извините. Это зависит от того, что вы пытаетесь сделать с OnClick. Если вы делаете то, что может быть сделано локально внутри самого ViewHolder (например, просто изменить размер изображения), вам не нужен интерфейс или какой-либо другой способ передачи OnClick обратно в адаптер. Тем не менее, если вы пытаетесь сохранить переход на новую активность или переключиться на изображение, которое у ViewHolder не имеет ссылки на вас, вам понадобится пользовательский прослушиватель (интерфейс), который у ViewHolder есть ссылка на него, а затем на личную деятельность или адаптер может слушать. – Devsil

+0

Мне нужно выполнить операции в onBindViewHolder – helloimyourmind

Смежные вопросы