У меня проблема с CursorLoader от android. Я использую CursorLoader для загрузки данных из моего собственного ContentProvider. Он хорошо загружает данные и сохраняет изменения ориентации, но при изменении данных он не обновляется. Кстати, я использую CursorLoader, который входит в библиотеку совместимости.CursorLoader не обновляется при изменении данных
Я думаю, что я сделал все, что мне рассказали документация и несколько уроков, но она по-прежнему не работает. Я проверил несколько сообщений на этом сайте, но nothig, похоже, исправил это.
Вот где я создаю погрузчик:
@Override
public Loader onCreateLoader(int id, Bundle args) {
switch (id) {
case TODO_EVIDENCES_LOADER_ID: {
return new CursorLoader(this, BuilderToDoContentProvider.TODO_EVIDENCES_CONTENT_URI, null, null, new String[]{token_id}, null);
}
}
return null;
}
Это метод, который я называю по методу запроса на мой ContentProvider:
private Cursor getToDoEvidences(String selection){
String evidenceQuery = "SELECT " + BuilderToDoContract.Evidence.TABLE_NAME + "." + BuilderToDoContract.Evidence._ID + ", " +
BuilderToDoContract.Evidence.TABLE_NAME + "." + BuilderToDoContract.Evidence._PATH + ", " + BuilderToDoContract.Evidence.TABLE_NAME + "." + BuilderToDoContract.Evidence._TIMESTAMP + ", " +
BuilderToDoContract.Evidence.TABLE_NAME + "." + BuilderToDoContract.Evidence._TYPE +
" FROM " + BuilderToDoContract.Evidence.TABLE_NAME + " WHERE " + selection;
Cursor result = database.rawQuery(evidenceQuery, null);
result.setNotificationUri(getContext().getContentResolver(), TODO_EVIDENCES_CONTENT_URI);
return database.rawQuery(evidenceQuery, null);
}
Это метод, который я называю на метод удаления моего контентаОбзор:
private int deleteEvidence(String[] selection) {
int result = database.delete(BuilderToDoContract.Evidence.TABLE_NAME, BuilderToDoContract.Evidence._PATH + " = ?" , selection);
getContext().getContentResolver().notifyChange(TODO_EVIDENCES_CONTENT_URI, null);
return result;
}
Как вы можете видеть, я создаю CursorLoader, вызывая s etNotificationUri() в моем запросе и вызове notifyChange() метода удаления, передающего тот же Uri, но onLoadFinished() не запускается при изменении данных. И я нигде не закрываю курсор.
В качестве обходного пути я перезапускаю загрузчик вручную, но это превосходит цель использования CursorLoader с LoaderManager.
Я не использую CursorAdapter, я помещаю данные, которые я получаю в onLoadFinished() внутри объекта Evidence, а затем вставляя этот объект в список, который является источником данных пользовательского адаптера, привязанного к GridView , Я делаю это, потому что мне нужно добавить другие данные к объекту Evidence, которого нет в курсоре.
Вы вообще закрываете курсор? – DeeV
Нет, я не закрываю курсор. Я собираюсь добавить его к вопросу. –