0

Я хочу настроить обработчики кликов для просмотра в строке RecyclerView. Я хочу обрабатывать щелчок элемента из фрагмента. Я попытался закодировать его на this tutorial. Но когда я пытаюсь определить, какое представление было нажато, оно возвращает -1.RecyclerVIew OnItemClick return -1

У меня внутри внутри адаптера.

public interface OnItemClickListener { 
     void onItemClick(View itemView, int position); 
    } 
    public void setOnItemClickListener(OnItemClickListener listener) { 
     this.mOnItemClickListener = listener; 
    } 

Тогда внутри конструктора ViewHolder я называю это:

itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (mOnItemClickListener != null) { 
         mOnItemClickListener.onItemClick(v, getLayoutPosition()); 
        } 
       } 
      }); 

И здесь в последний раз та часть, когда я установить слушатель из моего фрагмента:

mFollowingAdapter.setOnItemClickListener(new FollowingAdapter.OnItemClickListener() { 
      @Override 
      public void onItemClick(View itemView, int position) { 
        Log.d(Constants.TAG, itemView.getId() + " " + position); 
      } 
     }); 

Полного VIewHolder кода:

public class ViewHolder extends RecyclerView.ViewHolder { 
     private ImageView request_author_profile; 
     private TextView request_name; 
     private ImageView request_accept; 
     private ImageView request_decline; 

     public ViewHolder(final View itemView) { 
      super(itemView); 
      request_author_profile = (ImageView) itemView.findViewById(R.id.profile_image); 
      request_name = (TextView) itemView.findViewById(R.id.request_name); 
      request_decline = (ImageView) itemView.findViewById(R.id.btn_request_decline); 
      request_accept = (ImageView) itemView.findViewById(R.id.btn_request_accept); 
      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (mOnItemClickListener != null) { 
         mOnItemClickListener.onItemClick(itemView, getLayoutPosition()); 
        } 
       } 
      }); 
     } 
    } 

Спасибо за помощь.

+0

Пожалуйста, внесите код ViewHolder. –

+0

Что такое -1? идентификатор или позиция? – tachyonflux

+0

обновленный полный код зрителя -1 - это идентификатор, позиция работает –

ответ

0

Попробуйте установить анонимный промежуточный слушателю в onBindViewHolder() метода вместо конструктора ViewHolder, передавая позицию элемента в наборе данных onItemClick() вместо getLayoutPosition().

Целью ViewHolder является представление единственного элемента списка, видимого на экране, первоначально не связанного с какой-либо базовой частью данных. Метод onBindBiewHolder() привязывает его к элементу в наборе данных до тех пор, пока элемент должен отображаться. Установка промежуточного прослушивателя гарантирует, что позиция элемента в наборе данных будет передана слушателю клиента.

Вот упрощенный пример:

адаптер:

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> { 
    public interface OnItemClickListener { 
     void onItemClick(int position); 
    } 

    /* this is the public listener that you set from the outside of the adapter */ 
    private OnItemClickListener mOnItemClickListener; 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, final int position) { 

     /* update the intermediate listener so that it passes 
     * the correct position to the public listener */ 
     holder.setOnClickListener(new OnClickListener() { 
      if (mOnItemClickListener != null) { 
       mOnItemClickListener.onItemClick(position); 
      } 
     } 
     /* ... */ 
    } 
    /* ... */ 
} 

ViewHolder:

public class MyViewHolder extends RecyclerView.ViewHolder { 
    private View mView; 

    public MyViewHolder(final View itemView) { 
     mView = itemView; 
    } 

    /* delegate the setter to the (root) view */ 
    public setOnClickListener(OnClickListener listener) { 
     mView.setOnClickListener(listener); 
    } 
} 

Обратите внимание, что это отметить очень хорошую реализацию точки зрения производительности, так как она создает новый приемник объект каждый раз, когда объект ViewHolder привязан, но я думаю, что он хорошо передает идею. Лучшим решением было бы сохранить поле в ViewHolder, описывающее позицию в наборе данных, использовать его в промежуточном прослушивателе и обновить его значение в onBindViewHolder().

+0

Спасибо, друг, но я новичок, могу объяснить, как добавить слушателя в viewHolder? Нет стандартного метода. Могу ли я создать его в классе ViewHolder и вызвать его в bindVIewHolder? –

+0

Я добавил пример реализации в ответ. Надеюсь, это поможет. – SpaceBison