Обновление Android ListView Live - PullRequest
8 голосов
/ 09 марта 2012

У меня есть ListView в ListActivity, который привязан к некоторым данным.У меня есть провайдер контента, который предоставляет данные.

ListActivity получает данные путем запроса распознавателя контента:

Uri uri = Uri.parse("content://my.provider.DocumentProvider/mystuff");
contentCursor = this.getContentResolver().query(uri, null, null, null, null);

Так что теперь у действия есть курсор.Он создает адаптер и присоединяет его к списку:

ListAdapter adapter = new DocumentListCursorAdapter(this, R.layout.main_row_layout, contentCursor, new String[] { "titleColumn" }, new int[] { titleColumnIndex  });
setListAdapter(adapter);

Это отлично работает;список показывает данные в курсоре.

Но теперь у поставщика контента появились новые данные.Я хочу, чтобы список обновлялся для отображения новых данных.

Примеры, которые я видел, включают вызов адаптера notifyDataSetChanged, но мне кажется, что это нарушает разделение между поставщиком контента и списком,который потребляет контент.

Нужно ли поставщику контента знать, какие адаптеры подключены к курсору, чтобы он мог вызвать их метод notifyDataSetChanged?Или есть лучший способ не видеть эти две вещи соединенными таким образом.

Ответы [ 3 ]

6 голосов
/ 09 марта 2012

Я нашел ответ здесь:

http://mylifewithandroid.blogspot.com/2008/03/observing-content.html

В двух словах, поставщик вызывает notifyChange, чтобы указать, что содержимое в URI изменилось:

getContext().getContentResolver().notifyChange(uri, null);

И ListActivity вызывает setNotificationUri для курсора, чтобы зарегистрировать заинтересованность в получении уведомления об изменениях:

contentCursor.setNotificationUri(getContentResolver(), uri);

(Спасибо, njzk2, что указал мне правильное направление).

1 голос
/ 09 марта 2012

при условии, что ContentProvider принадлежит вам, вы должны добавить cursor.setNotificationUri(getContext().getContentResolver(), uri); в вашей query реализации CP (перед возвратом курсора) и getContext().getContentResolver().notifyChange(uri, null); в update, insert, delete ... SimpleCursorAdapter которая является основой вашего DocumentListCursorAdapter, должна позаботиться об обновлении списка.

0 голосов
/ 09 марта 2012

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

adapter.notifyDatasetChanged();

и

listview.invalidate()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...