最近在项目中有个需求,一个列表,每个item里面都含有一个Edittext,好,简单,手撸了一个recyclerview,然后测试了下,发现没问题,过2天,测试那边反馈一系列问题,都是围绕EditText复用展开的问题,于是我又耐心了debug了下,发现,数据少,不会有问题,但是数据一多,严重的复用问题就出来了,例:在第一个item的Edittext中输入一个数字,往下拉,再往上。。。。数据全乱了,没有的也有了。第一想到的就是recyclerview的复用问题,针对这个问题,现提出如下2种解决方案,根据自己的需求来选择,或者有更好的解决方法欢迎留言。
1.强制的停用Recyclerview的复用
在onbindViewholder中:
holder.setIsRecyclable(false);
此方法适合数据量不宜过大的用户,不然会出现卡卡的现象,具体效果,可以自己体验。
2.通过view的setTag()方法解决Recyclerview的复用
if (etMoney.getTag() instanceof TextWatcher) {
etMoney.removeTextChangedListener((TextWatcher) etMoney.getTag());
}
etMoney.setText(lottery.getBetMoney());
TextWatcher textWatcher = 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) {
if (s.length() > 0) {
lottery.setBetMoney(s.toString());
} else {
lottery.setBetMoney("");
}
if (listener != null) {
listener.onTextChange(position);
}
}
@Override
public void afterTextChanged(Editable s) {
}
};
etMoney.addTextChangedListener(textWatcher);
etMoney.setTag(textWatcher);
以上提供的2种方法都能解决问题,有更好的方案记得留言反馈哦!谢谢!
网友评论