0

各行に 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) {}

}
4

1 に答える 1