今天使用RecyclerView过程中遇到了坑,RecyclerView的条目中既有checkbox,又有edittext,然后将数据展示上去一点问题也没有,很美观,然而点击checkbox选中的时候,会发现其他条目中也有被选中的,原因在于我们在onBindViewHolder方法中使用viewhodler对条目进行复用,然后导致出现了问题。
找了一些解决方法,说是将RecyclerView设置为不复用,但是这种方式会影响到程序性能,数据多的时候,还会影响到稳定性,不推荐使用该方法。
另一种方式,在onBindViewHolder中设置checkbox的状态变化的监听,在状态发生变化时,将状态设置给我们的bean对象,然后在onBindViewHolder方法上方根据bean对象的选中状态,对viewHolder中的状态进行设置,并在设置状态变化的监听前,取消掉状态监听。如下:
// 先对复用控件设置选中状态
viewHolder.checkBox.setChecked(deviceValueBean.getIsChecked());
// 取消状态变化的监听
viewHolder.checkBox.setOnCheckedChangeListener(null);
// 重新设置状态变化监听
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (cbChangedListener != null) {
cbChangedListener.OnItemCBChangedListener(position, isChecked);
}
mDeviceValueBeanList.get(position).setIsChecked(isChecked);
}
});
通过以上方法,checkbox的数据串台问题解决了,但是还有edittext的串台问题,其实解决思路大致是一样的,还是先给edittext设置内容,再取消焦点变化的监听,然后设置焦点发生变化的监听,在该监听中获取焦点设置textwatcher,失去焦点取消textwatcher,在afterTextChanged方法中对bean对象的输入内容字段重新赋值。
viewHolder.edtDeviceValue.setOnFocusChangeListener(null);
viewHolder.edtDeviceValue.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
viewHolder.edtDeviceValue.addTextChangedListener(textWatcher);
} else {
viewHolder.edtDeviceValue.removeTextChangedListener(textWatcher);
}
}
});
final 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) {
}
@Override
public void afterTextChanged(Editable s) {
DeviceValueBean deviceValueBean1 = mDeviceValueBeanList.get(position);
deviceValueBean1.setInputContent(inputString);
}
};
然后根据有无输入内容,重新设置edittext的内容
if (TextUtils.isEmpty(deviceValueBean.getInputContent())) {
viewHolder.edtDeviceValue.setText("");
if (!TextUtils.isEmpty(minValue) && !TextUtils.isEmpty(maxValue)) {
String hint = "(" + minValue + " - " + maxValue + ")";
viewHolder.edtDeviceValue.setHint(hint);
} else {
viewHolder.edtDeviceValue.setHint(deviceValueBean.getTip());
}
} else {
viewHolder.edtDeviceValue.setText(deviceValueBean.getInputContent());
}
这里面,我刚开始只给edittext设置了hint内容,所以一直没发现这块的问题,在内容不为空的时候需要设置内容,为空的时候如有要设置hint内容,也需要调用setText()方法设置一个空字符串。
在edittext和checkbox的监听器中需要根据position重新获取bean对象,然后再对bean对象重新赋值才有效。
还有要看自己写的viewholder中的字段,每一个字段都需要设置相应的内容,内容不会变化的,直接设置,内容变化的,需要按照edittext和checkbox的方式进行动态设置。
————————————————
版权声明:本文为CSDN博主「sinat_29373223」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_29373223/article/details/102845467
网友评论