Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Recyclerview点击事件处理最佳实践?_Android_Android Recyclerview - Fatal编程技术网

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

Android Recyclerview点击事件处理最佳实践?,android,android-recyclerview,Android,Android Recyclerview,在Recyclerview中有许多处理单击事件的方法,但就性能和最小化错误而言,我不知道最好的方法 我看到的第一种方法是在onBindViewHolder方法中处理单击事件 @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int postion) { holder.button.setOnClickListener(new View.OnClickList

在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 
                 }
             });
         }
@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;
}
第二种方法是在
onCreateViewHolder
方法中处理单击事件

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

             holder.button.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
                   //Add action 
                 }
             });
         }
@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
或fragment,并在
MainActivity
或fragment中处理单击事件


哪种方法更好?

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

我更喜欢的干净方式是在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
    }
在视图/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())     

    }

我更喜欢界面方式界面。。。。谷歌最佳实践。我不喜欢你发布的两种方法。我更喜欢使用界面,即使你使用界面的方式,你也需要处理点击事件