我有一个RecyclerView,每行都有一个EditText。每个EditText都有一个附加的TextWatcher和一个数组中的对象,用于存储有关EditText的行和值的信息。
我面临的问题是,当行离开屏幕时,它会被回收,但在这个过程中,onTextChanged被用一个空字符串调用,这意味着一个空的字符串被保存到行的信息对象中。当再次加载该行时,它只加载一个空白值,有效地删除了之前EditText中的任何内容。这似乎是非常无用的功能,因为(据我所知)无法区分回收清除和用户实际清除EditText中的值,从而使RecyclerView中的EditText完全无用。
我的onBindViewHolder
方法是:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
int value = indicators.get(position).getValue();
System.out.println("VALUE: " + indicator.getValue());
if (value == -1) {
viewHolder.inputBox.setText("");
} else {
viewHolder.inputBox.setText(Integer.toString(value));
}
viewHolder.editListener.updatePosition(position);
}
我的TextWatcher是这样的:
private class EditBoxListener implements TextWatcher {
private int position;
private CharSequence sequence;
private boolean initialCall = true;
public void updatePosition(int _position) {
position = _position;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
System.out.println("TEXT CHANGED TO: " + charSequence.toString());
if (!initialCall) {
int value = -1;
try {
value = Integer.parseInt(charSequence.toString());
} catch (Exception e) {}
if (indicators.size() > 0) {
indicators.get(position).setValue(value);
}
} else {
initialCall = false;
}
}
@Override
public void afterTextChanged(Editable editable) {}
}
解决这个问题的一种方法是,在对文本进行任何操作之前,只需检查文本是否为空,也许是这样的(请原谅我格式不好):
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
if (!charSequence.equals("")) {
System.out.println("TEXT CHANGED TO: " + charSequence.toString());
if (!initialCall) {
int value = -1;
try {
value = Integer.parseInt(charSequence.toString());
} catch (Exception e) {}
if (indicators.size() > 0) {
indicators.get(position).setValue(value);
}
} else {
initialCall = false;
}
}
}