各行に EditText を持つ RecyclerView があります。各 EditText には TextWatcher がアタッチされており、行に関する情報と EditText の値を格納するための配列内のオブジェクトがあります。
私が直面している問題は、行が画面外になるとリサイクルされることですが、そのプロセスでは、空の文字列で onTextChanged が呼び出されます。つまり、空の文字列が行の情報オブジェクトに保存されます。その行が再度読み込まれると、空白の値が読み込まれるだけで、以前に EditText にあった内容が事実上削除されます。これは非常に役に立たない機能のように思えます。なぜなら (私が知る限り) リサイクル クリアとユーザーが実際に EditText の値をクリアすることを区別する方法がなく、RecyclerView の EditTexts が完全に役に立たなくなるからです。
私の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) {}
}