【问题标题】:Recyclerview click events handling best practice?Recyclerview点击事件处理最佳实践?
【发布时间】:2019-05-03 11:23:37
【问题描述】:

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或fragment发送信息并处理MainActivity或fragment中的点击事件。

哪种方式更好?

【问题讨论】:

  • 我更喜欢界面方式
  • 界面 .... Google 最佳实践。
  • 你发布的这两种方法我都不喜欢。我更喜欢使用界面
  • 即使你使用接口方式你也需要处理点击事件。

标签: android android-recyclerview


【解决方案1】:

在 ViewHolder 类 + Interface 中处理点击事件是最佳实践。

这是一个例子

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

【讨论】:

    【解决方案2】:

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

    在您的 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())     
    
        }
    

    【讨论】:

    • 发现这个 article 建议相同的做法
    猜你喜欢
    • 2017-04-26
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2021-12-23
    • 1970-01-01
    • 2014-09-04
    相关资源
    最近更新 更多