EditText теряет пользовательский ввод после прокрутки ListView

Мое приложение загружает данные из базы данных SQLite и загружает их в EditText внутри Listview. Всякий раз, когда я меняю значение редактируемого текста и прокручиваю список вниз, EditText возвращается к исходному значению, полученному из базы данных. Есть ли способ предотвратить это. Я поискал в Интернете ответ, но не смог его найти. Любая помощь будет принята с благодарностью.

    public class ExerciseAdapter extends CursorAdapter {

    Context context;

    public ExerciseAdapter(Context context, Cursor c) {
        super(context, c, 0);
        this.context = context;
    }


    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {

        return LayoutInflater.from(context).inflate(R.layout.list_item_exercise, parent, false);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        int nameCol = cursor.getColumnIndex(WorkoutContract.WorkoutEntry.EXERCISE_NAME);
        String name = cursor.getString(nameCol);
        int weightCol = cursor.getColumnIndex(WorkoutContract.WorkoutEntry.WEIGHT);
        int weightInt = cursor.getInt(weightCol);
        String weight = String.valueOf(weightInt);
        int repCol = cursor.getColumnIndex(WorkoutContract.WorkoutEntry.REPS);
        int repsInt = cursor.getInt(repCol);
        String reps = String.valueOf(repsInt);
        int rpeCol = cursor.getColumnIndex(WorkoutContract.WorkoutEntry.RPE);
        int rpeInt = cursor.getInt(rpeCol);
        String rpe = String.valueOf(rpeInt);

        EditText exerciseName = (EditText) view.findViewById(R.id.exercise_name_table);
        exerciseName.setText(name);
        EditText exerciseWeight  = (EditText) view.findViewById(R.id.exercise_weight_table);
        exerciseWeight.setText(weight);
        EditText exerciseReps = (EditText) view.findViewById(R.id.exercise_reps_table);
        exerciseReps.setText(reps);
        EditText exerciseRpe = (EditText) view.findViewById(R.id.exercise_rpe_table);
        exerciseRpe.setText(rpe);

    }
}

    public class ExerciseActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {

    private ExerciseAdapter adapter;
    Uri exerciseUri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_exercise);


        ListView listView = findViewById(R.id.list);
        Intent intent = getIntent();
        exerciseUri = intent.getData();
        adapter = new ExerciseAdapter(this, null);
        listView.setAdapter(adapter);
        getLoaderManager().initLoader(0, null, this);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        String[] projections = {
                WorkoutContract.WorkoutEntry._ID,
                WorkoutContract.WorkoutEntry.DAY_ID,
                WorkoutContract.WorkoutEntry.EXERCISE_NAME,
                WorkoutContract.WorkoutEntry.WEIGHT,
                WorkoutContract.WorkoutEntry.REPS,
                WorkoutContract.WorkoutEntry.RPE
        };
        return new CursorLoader(
                this,
                exerciseUri,
                projections,
                null,
                null,
                null
        );
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        adapter.swapCursor(data);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        adapter.swapCursor(null);
    }
}

@ADM Я видел этот пост, когда пытался исследовать свою проблему, но я не нашел этот ответ применимым к моему сценарию.

Omar Carino 21.10.2018 08:59

Значит, вы не поняли там ответов. У всех видов адаптера есть свойство Recycling. Как только ваше представление выходит за пределы AdapterView, оно перерабатывается и создается снова, когда доступно для отображения на экране во время прокрутки. Вам нужно сохранить текст во время прокрутки. На мой взгляд, я бы не стал использовать EditText внутри ListView и поищу другой подход (MayBe может вводить данные с помощью диалога).

ADM 21.10.2018 09:04

@ADM Спасибо, что объяснили, я еще раз посмотрю! Спасибо!

Omar Carino 21.10.2018 09:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
64
1

Ответы 1

Вы можете добавить прослушиватель onFocusChanged для EditText, и если фокус не на EditText, обновите БД или сохраните значение для последующего извлечения.

Что-то вроде: -

    et_childname.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View view, boolean b) {
            if (!b) {
                Child c = (Child) view.getTag();
                c.setName(et_childname.getText().toString());
                ((MainActivity)mActivity).changedChild(c); 
            }
        }
    });
  • где et_childname - EditText
  • b, второй параметр b равен true, если EditText имеет фокус, иначе false (отсюда и проверка).
  • Тег в этом случае является базовым дочерним объектом в этом случае, затем он модифицируется и отправляется в действие для обработки. Этот код находится в адаптере ListView.

Другие вопросы по теме