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