Recyclerview события клика, обрабатывающие лучшие практики? - PullRequest
0 голосов
/ 03 мая 2019

В Recyclerview есть много методов для обработки событий щелчков, но я не знаю лучшего метода с точки зрения производительности и минимизации ошибок.

Первый метод, который я увидел, - обработать событие щелчка в onBindViewHolder Метод

   @Override
         public void onBindViewHolder(@NonNull MyViewHolder holder, int postion) {

             holder.button.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
                   //Add action 
                 }
             });
         }

Второй метод - обработка события клика в onCreateViewHolder Метод

@Override
public Viewholder onCreateViewHolder(ViewGroup parent, int viewType) {
 View v = LayoutInflater.from(parent.getContext()).inflate(item_adapter,    parent, false);
 final ViewHolder holder = new ViewHolder(v);

 holder.itemView.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
        // Add action
     }
 });
 return holder;
}

Третий метод - использовать интерфейс и отправлять информацию в MainActivity или фрагмент и обрабатывать событие щелчка в MainActivity или фрагмент.

Какой способ лучше?

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Обработка события клика в классе ViewHolder + Интерфейс - лучший способ следовать.

Вот пример

interface ClickListener{
    fun onItemClick(position:Int,item:Forecast)
}

var clickListener:ClickListener?= null
inner class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView)
{
    init {
        itemView.r_forecast_tv_forecast.setOnClickListener {
            val position = adapterPosition
            val model = data[position]
            clickListener?.onItemClick(position,model)
        }
    }
}
0 голосов
/ 03 мая 2019

Чистым способом, который я предпочитаю, является установка тега для элемента в onBindViewHolder и получение тех же данных тега в классе просмотра.

 @Override
    public void onBindViewHolder(myViewHolder viewHolder, int position) {
        viewHolder.button.setTag(position); //Here we are setting a position integer
        viewHolder.button.setTag(object); //set any custom object this way
    }

В вашем классе View / Activity / Fragment получите тег и получите данные

     @Override
public void onClick(View view) {
    int position = (int) view.getTag();  
    Log.e("DEMO","Position"+position)

    if(view.getTag() instanceOf Object) {

    Object object = (Object) view.getTag();   
    Log.e("DEMO","Position"+obect.getName())     

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...