【问题标题】:Multiples event trigger(onClick) inside a recycler view回收器视图中的多重事件触发器(onClick)
【发布时间】:2019-03-12 22:15:15
【问题描述】:

我有一个带有多个视图的 recyclerView,我已经正确解决了所有不同的视图,并且一些视图用相同的 ViewGroup 表示,在视图组内我有一个按钮,当单击此按钮时它会更改 textView 中的值,直到现在一切工作得很好,问题是当我触发事件时,当我单击一个按钮时,同一视图组列表中的所有视图组发生变化有什么不正常的,知道为什么会发生这样的事情吗?

我的 ViewHolder Hirechary 看起来像这样。

public abstract class AbstractViewHolderR extends RecyclerView.ViewHolder{

   public Button btn;
   public TextView view; 

   ...
}

public class ChildVH1 extends AbstractViewHolderR{
  ...
}

...other ViewHolder look the same.

/// the event listener look like this.
public class Click implement View.OnClickListener{
   AbstractViewHolderR object;
   public Click(AbstractViewHolderR o){
       object = o;
   }
   @Override
   public void onClick(View v){
     ////error checking omited
     Integer ii = Integer.Parse(object.view.getText().toString);
     ii++;
     object.view.setText(ii.ToString());
   }

}

【问题讨论】:

    标签: java android events android-recyclerview


    【解决方案1】:

    将你的 TextView 和 Btn 移动到 View holder 中,你应该像这样将点击监听器添加到 ViewHolder 本身

    public abstract class AbstractViewHolderR extends RecyclerView.ViewHolder{
    
             //UPDATE
       @Override
       public long getItemId(int position) {
           return position;
       }
       ...
    }
    
    public class ChildVH1 extends RecyclerView.ViewHolder{
       public Button btn;
       public TextView view; 
    
       public ChildVH1(View itemView){
          btn.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                          //do your stuff
                          //you can use getAdapterPosition() to get current 
                           //position in adapter
                      }
                  });
         }
    }
    
    }
    

    【讨论】:

    • 我尝试了另一个活动,结果是相同的结果:活动代码是gist.github.com/aneury1/667b936b53fd50c6b78c4f4ca4d43de4
    • @AneuryPerez 您的代码缺少 1 个重要的方法 getItemId()。如果您不添加此方法,则会导致重复。我更新了我的答案。请检查
    • 我已经实现了这个函数覆盖,结果相同,但最后我意识到我的错误是不明白 RecyclerView 在需要时回收每个持有者,为了摆脱这个错误,我使用了itemId 的想法,但在另一个类中,我将新类作为模型,其中包含列表中每个条目的值,我在适配器中的 onbindviewholder 上设置每个持有者的更新值可能不是最好的选择,但这种情况下它工作正常。如果您有其他选择,我会尝试。
    猜你喜欢
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 2013-07-07
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    相关资源
    最近更新 更多