繁体   English   中英

为什么滚动时 RecyclerView (在我的情况下)中 CardView 的内容会发生变化?

[英]Why is the content of CardView inside a RecyclerView (in my case) changing when I scroll?

我有同样的问题,比如这篇文章"Cardview's data are changed while scrolling RecyclerView"

但是取出静力学是行不通的。

我正在做的事情的背景:

我在FlexboxLayoutCardView中添加了几个按钮(在RecyclerView中的CardView )。 按钮正在动态添加。

同样的事情发生在几个TextView上,我在Button之后添加到CardView

问题:

Button s 和TextView s 被相乘,而我滚动。

滚动时正在交换不同CardView的上下文。

视频: https://sendvid.com/adugp8vh

我正在使用什么:

RecyclerView位于我的Fragment之一( ConstraintLayout )中,我在其中定义了回收器适配器。

这是我的适配器

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {
ArrayList<DataModel> dataSet = new ArrayList<DataModel>();
Context currentContext;

public class MyViewHolder extends RecyclerView.ViewHolder {

    public Button datumButton;
    public FlexboxLayout matchedWordsLayout;
    public LinearLayout textviewLayout;



    public MyViewHolder(View itemView) {
        super(itemView);
        this.datumButton = (Button) itemView.findViewById(R.id.datumButton);
        this.matchedWordsLayout = (FlexboxLayout) itemView.findViewById(R.id.matchedWordsLayout);
        this.textviewLayout = (LinearLayout) itemView.findViewById(R.id.textviewLayout);

    }
}


public CustomAdapter(ArrayList<DataModel> data, Context currentContext) {
    this.dataSet = data;
    // currentContext not getting it from here

}

@NonNull
@Override
public CustomAdapter onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view =  LayoutInflater.from(parent.getContext())
            .inflate(R.layout.positive_result_card, parent, false);

    MyViewHolder myViewHolder = new MyViewHolder(view);
    this.currentContext = parent.getContext();
    return myViewHolder;
}


@RequiresApi(api = Build.VERSION_CODES.O)
//@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int listPosition) {
    Button DatumButton = holder.datumButton;
    FlexboxLayout MatchedWordsLayout = holder.matchedWordsLayout;
    LinearLayout TextviewLayout = holder.textviewLayout;

    //Modify the button for date
    ArrayList <String> TTMMYY = dataSet.get(listPosition).getDatum();
    String Datum = String.join(".", TTMMYY);
    DatumButton.setText(Datum);
    DatumButton.setTag(Datum);
  

  



    // add button for each word
    ArrayList <String>  ButtonNames = dataSet.get(listPosition).getButtonnames();

    for (String Buttonname : ButtonNames) {
        Button sampleButton = new Button(currentContext);
        sampleButton.setText(Buttonname);
        sampleButton.setTag(Datum); 

        MatchedWordsLayout.addView(sampleButton);
    }

    
    ArrayList <String> textLines = dataSet.get(listPosition).getTextLines();
    

   
    for (String satzt : textLines){
        TextView sampleTextView = new TextView(currentContext);
        sampleTextView.setText(satzt);

        TextviewLayout.addView(sampleTextView);
    }





}

@Override
public int getItemCount() {
    return dataSet.size();
}
  }

我的文字可能有错误

您在每次绑定时以编程方式添加View ,但您永远不会删除它们,因此每次绑定只会添加更多(请记住ViewHolder被重复使用,因此您上次添加的ButtonTextView仍然存在)。 要修复它,请在添加新子项之前从ViewGroup中删除所有子项:

    // Added: remove all the children before we add more
    MatchedWordsLayout.removeAllViews();

    for (String Buttonname : ButtonNames) {
        Button sampleButton = new Button(currentContext);
        sampleButton.setText(Buttonname);
        sampleButton.setTag(Datum); 

        MatchedWordsLayout.addView(sampleButton);
    }

    
    ArrayList <String> textLines = dataSet.get(listPosition).getTextLines();
    
    // Added: remove all the children before we add more
    TextviewLayout.removeAllViews();

    for (String satzt : textLines){
        TextView sampleTextView = new TextView(currentContext);
        sampleTextView.setText(satzt);

        TextviewLayout.addView(sampleTextView);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM