每做完一个项目,就会抽时间来总结下遇到的问题,今天就写下EditText在RecyclerView中遇到的问题,也不知道这样解决是不是好办法。
1.EditText在RecyclerView会遇到什么问题呢,首先是RecyclerView复用问题,应用RecyclerView有复用机制,会导致RecyclerView中的EditText出现错乱,甚至值会发生变化。我的解决方式是每一个EditText设置一个tag,然后再输入完成的时候取出tag,具体代码就是
在Holder设置值之前设置
mTvName.setTag(position);
mTvName.addTextChangedListener(new myTextWatcher(mEdDeviceFt, 1, position)); //1代办第列,因为项目里RecyclerView一行有多个EditText,position代表第几列 myTextWatcher 是个内部类
class myTextWatcher implements TextWatcher {
private EditText view;
private int index;
private int position;
public myTextWatcher(EditText view, int index, int position) {
this.view = view;
this.index = index;
this.position = position;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
int tagPosition = (int) view.getTag();
if (position != tagPosition) return;
}
@Override
public void afterTextChanged(Editable s) {
int tagPosition = (int) view.getTag();
if (position != tagPosition) return;
if (mOnItemEdChangeListener != null) {
if(view.hasFocus()){
mOnItemEdChangeListener.onChange(tagPosition, index, s.toString());
}
}
}
}
这个就能解决错乱问题
2.动态添加、删减带EditView 的RecyclerView的项,同时点击选择项,进行填充数据
如下图
这种即使用了1的方法,也会出现输入数据错乱问题。
我的解决方法是,点击选择的时候,获取它焦点,清除输入框的焦点,当输入的时候再获取焦点,这样数据不会因为点击事件的变换而变化。
mEdCount.setTag(position); mEdCount.setOnFocusChangeListener(new myFocus(mEdCount, position));
class myFocus implements View.OnFocusChangeListener {
private EditText view;
private int position;
public myFocus(EditText view, int position) {
this.view = view;
this.position = position;
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
int tagPosition = (int) view.getTag();
if (position != tagPosition) return;
if (hasFocus) {
view.addTextChangedListener(new myTextWatcher(view, position));
} else {
view.removeTextChangedListener(new myTextWatcher(view, position));
}
}
}
不知道说得对不对,但是我确实这样解决了问题。