Intereting Posts

Обновления Android ListView Live

У меня есть 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? Или есть лучший способ, который не видит эти две вещи таким образом.

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

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

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

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

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

 contentCursor.setNotificationUri(getContentResolver(), uri); 

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

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

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

 adapter.notifyDatasetChanged(); 

а также

 listview.invalidate()