Recyclerview点击事件处理最佳实践?

时间:2019-05-03 11:23:37

标签: android android-recyclerview

在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或片段中的click事件。

哪种方法更好?

2 个答案:

答案 0 :(得分:1)

在ViewHolder类+接口中处理click事件是遵循的最佳实践。

这里是一个示例

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)
        }
    }
}

答案 1 :(得分:0)

我更喜欢的干净方法是在onBindViewHolder中为项目设置标签,并在View类中接收相同的标签数据。

 @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
    }

在您的“视图/活动/片段”类中接收标签并获取数据

     @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())     

    }
相关问题