原因:recycleview的复用机制
方法一:强制停用Recyclerview的复用
holder.setIsRecyclable(false);//防止editText数据错乱
方法二:在onBindViewHolder()中判断EditText是否获取了焦点,只有在获取焦点了在进行内容的改变。
if (addItemTextChanged != null) {
TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// addItemTextChanged.beforeTextChanged(s,start,count,after);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// addItemTextChanged.onTextChanged(s,start,before,count);
}
@Override
public void afterTextChanged(Editable s) {
if(holder.itemStockOrderInQty.hasFocus()){
addItemTextChanged.afterTextChanged(s.toString(), position);
}
}
};
holder.itemStockOrderInQty.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus){
holder.itemStockOrderInQty.addTextChangedListener(textWatcher);
}else {
holder.itemStockOrderInQty.removeTextChangedListener(textWatcher);
}
}
});
}
最好是在item布局中EditText的父级控件中找一个,设置成
android:focusable="true"
android:focusableInTouchMode="true" 确保在开始的时候EditText就不获取焦点。
方法三:通过view的setTag()方法解决Recyclerview的复用
holder.itemStockOrderInQty.setTag(position);
holder.itemStockOrderInQty.clearFocus();
TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// addItemTextChanged.beforeTextChanged(s,start,count,after);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// addItemTextChanged.onTextChanged(s,start,before,count);
}
@Override
public void afterTextChanged(Editable s) {
if (addItemTextChanged != null) {
addItemTextChanged.afterTextChanged(s.toString(), (int)
holder.itemStockOrderInQty.getTag());
}
}
};
holder.itemStockOrderInQty.addTextChangedListener(textWatcher);
holder.itemStockOrderInQty.setText(String.valueOf(mStockOrderInList.get((int)holder.itemStockOrderInQty.getTag()).getQty()));
第一种方法加载大量数据时比较慢,比较都禁用了复用机制,第二种跟第三种就不会,大神们建议是用第三种哦