2011-03-24 1 views
0

Я хотел бы создать ListView на Android, где у меня есть возможность добавить новую пустую строку и изменить элементы управления в новой строке. Затем на каком-либо событии (либо пользователь снова нажимает кнопку добавления, либо выбирает другую строку, либо какой-либо другой триггер, который я еще не определил), я хочу обновить адаптер с любыми значениями, введенными пользователем в редактируемую строку.Редактируемый ListView - Адаптер обновления с значениями пользовательского интерфейса

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

Первоначально я думал, что адаптеры являются связующими данными в двух направлениях, но это, похоже, не так. Из моих исследований и экспериментов, если я изменил значение адаптера и вызвал notifyDataSetChanged(), тогда пользовательский интерфейс будет обновлен. Есть ли обратная операция?

+0

Как вы редактируете значения в ListView?После изменения набора данных и вызова notifyDataSetChanged() вы должны просто запросить элемент ListView для данных, которые вы вложили в него. – LeffelMania

ответ

2

Я был в состоянии выполнить данные двухсторонние связывания добавив KeyListener и OnFocusChangeListener к каждому из элементов управления в представлении моей строки. Оба этих события вызовут метод, который я создал в представлении моей строки, чтобы перебрать все элементы управления в представлении и обновить данные моего адаптера с текущими значениями. Я должен был не звонить notifyDataSetChanged(). Этот метод необходим только для программного изменения объекта источника данных, а пользовательский интерфейс отражает изменения.

Не самый эффективный способ когда-либо, но он работает прилично.

Еще одна вещь, которую нужно отметить, добавить и удалить строки Мне нужно было установить как контроль, так и уровень шумов обновления обновления моего адаптера. Для делегирования то, что я сделал, это добавить событие с длинным кликом в представлении моей строки, чтобы иметь меню с опцией удаления. Затем я начал подавлять обновления на уровне представления, потому что я программно редактирую свой объект источника данных для удаления данных данной строки и вызываю notifyDataSetChanged() (в противном случае ОС будет генерировать исключение). Шумоподавление здесь гарантирует, что я не ударяю свои события и не попаду в бесконечный цикл и что мои данные правильно синхронизированы. Затем в удаленной строке View я установил все свои элементы управления, чтобы сжать адаптер обновления своего события. Это связано с тем, что у удаленной строки View все еще есть фокус, и я хочу убедиться, что я не обновляю свой объект источника данных со значениями, не входящими в пользовательский интерфейс. Этот флаг получает щелчок, как только я получаю представление строки назад из процесса рециркуляции ListView в getView() моего адаптера.

Добавление новой строки Мне также нужно шумоподавлять только уровень представления строки. Это связано с тем, что я программно меняю свой источник данных на новую пустую строку данных и вызываю notifyDataSetChanged. Причины точно такие же, как и удаление.

0

Ваша проблема в том, что вы, например, можете разместить 300 элементов в списке (которые представлены в EditItems), но только 12-20 EditItems в действительности, которые переработаны. Я предполагаю, что ваш единственный способ узнать, что использование закончилось с его строкой, - FocsedChangedListener на каждом из ваших представлений. После фокуса от использования:

  1. в использовании GetView вашего адаптера: если v ваш взгляд, то делать v.setTag (позиция)
  2. в OnFocusChangedListener раз фокус от использования: ИНТ поз = (Integer) v.getTag(); mAdapter.updatePosition (текст, позы)
  3. убедитесь, что ваш адаптер имеет Обновит mthod, который будет обновлять объект в позиции позах со строкой «текстом»
+0

Проблемы, которые я вижу с помощью onFocusChangedListener: 1) Это срабатывает только в том случае, если я использую трекбол для перехода от одного редактируемого элемента управления в строке 1 к следующему редактируемому элементу управления в строке 2. 2) Нажатие любой кнопки вне списка не запускает это мероприятие. 3) Прокрутка списка не вызывает это событие. –

0

Чтобы немного улучшить решение C Nick, вы можете использовать EditText.addTextChangedListener.