我们都知道,如果在RecyclerView中包含EditText控件的时候,不做处理会导致数据错乱问题。
原因:
由于ViewHolder的复用机制导致
解决办法:
1、在ViewHolder中初始化TextWacher
public static class MyViewHolder extends BaseViewHolder {
private ExampleBean bean;
// 用于防止TextWatcher递归调用
private TextWatcher watcher1, watcher2;
private Callback callback;
public MyViewHolder(@NonNull ViewDataBinding binding) {
super(binding);
setupTextWatchers();
}
public void bind(ExampleBean bean) {
this.bean = bean;
setTextWithoutTrigger(binding.etProject, bean.getPartsName(), watcher1);
setTextWithoutTrigger(binding.etCount, bean.getPartsNum(), watcher2);
}
private void setupTextWatchers() {
watcher1 = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (null != bean) {
//这里可以做数据设置操作
}
}
};
watcher2 = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (null != bean) {
//这里可以做数据设置操作
}
}
};
}
private void setTextWithoutTrigger(EditText editText, String text, TextWatcher watcher) {
if (null != watcher) {
editText.removeTextChangedListener(watcher);
}
editText.setText(text);
if (null != watcher) {
editText.addTextChangedListener(watcher);
}
}
}
2、在adapter中使用:
@Override
public void onBindViewHolder(@NonNull AdvanceFeeInfoVh holder, int position) {
holder.bind(mDatas.get(position));
}