0

У меня есть список на 1-ое мероприятие (использует пользовательские CursorAdapter, CursorLoader и ContentProvider), и когда пользователь нажимает на строку списка, он открывает еще одну вторую активность, где пользователь может УДАЛИТЬ этот элемент. Когда он выбирает DELETE, строка в таблице в базе данных удаляется (с помощью ContentProvider) и 2-го действия finish(). Но 1-я активность по-прежнему показывает старый контент.ContentProvider и Listview - данные не обновляются после изменений содержимого

Я думал, что, поскольку ContentProvider несут и CursorLoader получает каждое обновление, удаляет и вставляет обновления, мой список в 1-й активности должен показывать новый список без этой удаленной строки. Но он все еще здесь.

Прежде, я получаю эти изменения методом requery() или с другими методами, которые передаются в CursorAdapter и ListView в onRestart(), данные изменяются.

Я смутил то, что я должен был сделать, чтобы показать в ListView в 1-м действии только фактические данные после удаление?

Может быть, я должен использовать

loaderManager.restartLoader(LOADER_ID, null, mCallbacks); 

? в onRestart(), но почему?

+0

ли вам удалось решить эту проблему. Я нахожусь в беде. – f470071

ответ

1

При изменении базовых данных данные, предоставленные в ListView вашим ContentProvider, автоматически не будут обновляться автоматически. Вам необходимо уведомить приложение ContentResolver о том, что данные для одного из зарегистрированных вами контент-провайдеров изменились.

Вы делаете это, отправляя уведомление через ContentResolver в соответствующий URI соответствующего ContentProvider. Строка кода выглядит так:

getContentResolver().notifyChange(MY_URI, null); 

Вы можете добавить это в свою вторую деятельность после удаления. Очевидно, вам нужно обновить MY_URI до соответствующего URI для вашего поставщика контента. Если вы правильно выполнили свой LoaderManager, вы увидите обновление данных ListView с новыми данными.

+0

Это будет работать, если данные будут изменены из той же самой активности, где находится listview. Но если данные изменяются в другой деятельности через контент-провайдера, это не работает. Метод notifyChange() просто не обновляет listview. очень надоедливый. – f470071

0

Я использовал это в моем подобном случае:

getLoaderManager().restartLoader(0, null, this);