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