Редактируемый ListView - Обновить адаптер со значениями пользовательского интерфейса - PullRequest
0 голосов
/ 24 марта 2011

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

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

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

Ответы [ 3 ]

2 голосов
/ 07 апреля 2011

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

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

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

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

0 голосов
/ 12 января 2012

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

0 голосов
/ 25 марта 2011

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

  1. в использовании getView вашего адаптера: если v - ваш View, тогда делайте v.setTag (position)
  2. в OnFocusChangedListener, если фокус отключен, используйте: int pos = (Integer) v.getTag (); mAdapter.updatePosition (текст, позы)
  3. убедитесь, что в вашем адаптере есть метод update, который обновит объект в позиции pos с помощью строки 'text'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...