RecyclerView中的Binding将数据绑定到多行

Binding in RecyclerView binds data to multiple rows

我对 RecyclerView 中的数据绑定非常着迷。问题是它将数据绑定到多行,我不知道为什么。

我尽可能地简化了我的代码。当我们启动应用程序时,有 200 行带有标签(默认为空值)和按钮。当我单击一个按钮时,我的标签会更改它的值。

所以这是一个打开的activity。如您所见,没有显示任何标签。

让我们点击第一行的一个按钮

正如预期的那样,标签出现在正确的位置。让我们现在滚动。

我们可以看到标签也出现在第 11、21 等位置。知道为什么吗?

我的适配器:

 @NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
    ListLearnItemBinding itemBinding = ListLearnItemBinding.inflate(layoutInflater, parent, false);
    return new LearnItemViewHolder(itemBinding);
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    final LearnItemViewHolder viewHolder = (LearnItemViewHolder) holder;
    // init binding
    if(viewHolder.getBinding().getItem2() == null){
        TestBinding t = new TestBinding();
        t.setRating("");
        viewHolder.getBinding().setItem2(t);
    }

    viewHolder.getBinding().test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            TestBinding item2 = new TestBinding();
            item2.setRating("Label");
            viewHolder.bind(item2);
        }
    });
}

@Override
public int getItemCount() {
    return 200;
}

ViewHolder:

public class LearnItemViewHolder extends RecyclerView.ViewHolder {
    public ListLearnItemBinding getBinding() {
        return binding;
    }

    private final ListLearnItemBinding binding;

    public LearnItemViewHolder(ListLearnItemBinding binding) {
        super(binding.getRoot());
        this.binding = binding;
    }

    public void bind(TestBinding testItem) {
        binding.setItem2(testItem);
        binding.executePendingBindings();
    }
}

绑定模型

public class TestBinding {
    public String getRating() {
        return rating;
    }

    public void setRating(String rating) {
        this.rating = rating;
    }

    private String rating;
}

我的视图的OnCreate

    binding.recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
    binding.recyclerView.setItemAnimator(new DefaultItemAnimator());
    LearnAdapter mAdapter = new LearnAdapter(this, data);     
    binding.recyclerView.setAdapter(mAdapter);

布局

  <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@{String.valueOf(item2.rating)}" />

  <Button
      android:id="@+id/test"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentTop="true"
      android:layout_marginTop="20dp"
      />

发生这种情况是因为当您滚动时旧视图被重新用于优化。 你需要这样的东西:

private List<String> mList;

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    final LearnItemViewHolder viewHolder = (LearnItemViewHolder) holder;

    TestBinding t = new TestBinding();
    t.setRating(mList.get( position);
    viewHolder.bind(t);

    viewHolder.getBinding().test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            TestBinding item2 = new TestBinding();
            String label ="Label";
            item2.setRating(label);
            mList.set(position, label);
            viewHolder.bind(item2);
        }
    });
}

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