Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.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
Java 在回收器视图中重复事件触发器(onClick)_Java_Android_Events_Android Recyclerview - Fatal编程技术网

Java 在回收器视图中重复事件触发器(onClick)

Java 在回收器视图中重复事件触发器(onClick),java,android,events,android-recyclerview,Java,Android,Events,Android Recyclerview,我有一个带有多重视图的recyclerView,我已经正确地解决了所有不同的视图持有者,一些视图持有者用相同的视图组表示,在视图组中,我有一个按钮,当这个按钮被单击时,它会更改文本视图中的值,直到现在一切都正常工作,问题是,当我触发事件时,同一视图组列表中的所有视图组中的某些视图组发生了更改,当我单击一个按钮时,该按钮的顺序不是列表中的特定顺序,而是实例中的常量,我已经设置了一些断点,但有任何异常,任何ide为什么会发生这种情况 我的ViewHolder Hirechary看起来像这样 publ

我有一个带有多重视图的recyclerView,我已经正确地解决了所有不同的视图持有者,一些视图持有者用相同的视图组表示,在视图组中,我有一个按钮,当这个按钮被单击时,它会更改文本视图中的值,直到现在一切都正常工作,问题是,当我触发事件时,同一视图组列表中的所有视图组中的某些视图组发生了更改,当我单击一个按钮时,该按钮的顺序不是列表中的特定顺序,而是实例中的常量,我已经设置了一些断点,但有任何异常,任何ide为什么会发生这种情况

我的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());
   }

}

将您的TextView和Btn移到ViewHolder,您应该像这样将click listener添加到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
                  }
              });
     }
}

}

我尝试了另一个活动,结果是相同的:活动代码是@AneuryPerez您的代码缺少1个重要的方法getItemId()。如果不添加此方法,则会导致重复。我更新了我的答案。请检查我已经用同样的结果实现了这个函数覆盖,但最后我意识到我犯的错误是不理解RecyclerView在需要时回收每个持有者,为了消除这个错误,我使用了itemId的概念,但在另一个类中,我将新类作为一个模型,它包含列表中每个条目的值,我在适配器中的onbindviewholder上设置每个holder的更新值,这可能不是最好的选择,但在这种情况下它可以工作。如果你有其他选择,我会试试。