Элементы EditText в списке прокрутки теряют свои изменения при прокрутке с экрана - PullRequest
1 голос
/ 14 июня 2010

У меня есть длинный прокручиваемый список элементов EditText, созданный SimpleCursorAdapter и предварительно заполненный значениями из базы данных SQLite.

Я делаю это по:

cursor = db.rawQuery("SELECT _id, criterion, localweight, globalweight FROM " + dbTableName + " ORDER BY criterion", null);

startManagingCursor(cursor);

mAdapter = new SimpleCursorAdapter(this, R.layout.weight_edit_items, cursor, new String[]{"criterion","localweight","globalweight"}, new int[]{R.id.criterion_edit, R.id.localweight_edit, R.id.globalweight_edit});    

this.setListAdapter(mAdapter);

Список прокрутки состоит из нескольких экранов эмулятора. Элементы отображаются ОК - их прокрутка показывает, что каждый из них имеет правильное значение из базы данных.

Я могу внести изменения в любой из EditTexts, и новый текст будет принят и отображен в поле.

Но ... если я затем прокручиваю список достаточно далеко, чтобы убрать отредактированный элемент с экрана, когда я прокручиваю назад, чтобы посмотреть на него снова, его значение вернулось к тому, что было до того, как я внес изменения, т.е. мои правки были потеряны.

Пытаясь разобраться в этом, я сделал getText, чтобы посмотреть, что находится в EditText, после того как я сделал свои правки (и перед прокруткой), и getText возвращает оригинальный текст, даже хотя EditText отображает мой новый текст. Кажется, что EditText только принял мои правки поверхностно, и они не были привязаны к EditText, то есть они упали при прокрутке с экрана.

Может кто-нибудь сказать мне, что здесь происходит и что мне нужно сделать, чтобы заставить EditText сохранить свои правки?

Спасибо

Ian

Ответы [ 2 ]

3 голосов
/ 14 июня 2010

Но ... если я тогда прокручиваю список далеко достаточно, чтобы снять отредактированный элемент с экран, когда я прокручиваю назад, чтобы посмотреть на это снова его значение вернулось к что это было до того, как я сделал изменения, то есть. мои правки были потеряны.

Конечно.

Перечислены строки списка. В вашем Cursor может быть 1000 записей, но при просмотре списка не будет создано 1000 EditText виджетов. Скорее, их будет около 10, в зависимости от того, сколько строк одновременно видно. Строки перерабатываются, и операция связывания заменяет старое значение EditText новым значением из Cursor для любой строки, только что прокручиваемой на экран, заменяя все, что было раньше (предыдущее значение из базы данных или пользовательское изменение значение).

И, поскольку обычный Cursor является неизменным, у вас нет возможности сохранить какие-либо правки таким образом, чтобы их можно было прозрачно вернуть в список.

Я подозреваю, что можно создать ListView со строками, которые EditTexts, возможно, создав собственный класс Adapter и обработав все строки самостоятельно. Тем не менее, это будет изрядный объем работы, и встроенные классы дадут вам лишь небольшую поддержку этого шаблона.

0 голосов
/ 09 ноября 2012

Я искал во всем SO ответ на этот конкретный вопрос и, наконец, смог решить проблему с помощью onFocusChangeListener на моем EditText в адаптере. Я разместил свое решение здесь: https://stackoverflow.com/a/13312282/1812518

...