Как я могу обновить курсор из CursorLoader?
Итак, у меня есть MainDisplayActivity
, который реализует как Activity
, так и LoaderManager.LoaderCallbacks<Cursor>
. Здесь у меня есть A ListView
, который я заполняю информацией о Повестке, которую я получаю из своей базы данных с помощью ContentProvider. У меня также есть GridView
, который является календарем. Я настроил его при нажатии на ячейку, чтобы повестка дня была обновлена с нажатием на день. Моя проблема заключается в том, что при повторном использовании Loader, который я создал в onCreate()
внутри setOnItemClickListener(), он не обновляет информацию с помощью нового курсора, который я создаю. Я могу просто создать новый Loader с другим ID, и он работает один раз, но как только я нажимаю другой день, он перестает освежать. Проблема заключается в курсоре. Как я могу обновить курсор с загрузчика, поэтому мне не нужно создавать новый Loader? Спасибо заранее!
Первоначальный вызов для создания загрузчика в onCreate() в классе My MainDisplayActivity
:
makeProviderBundle(new String[] {"_id, event_name, start_date, start_time, end_date, end_time, location"},
"date(?) >= start_date and date(?) <= end_date", new String[]{getChosenDate(), getChosenDate()}, null);
getLoaderManager().initLoader(0, myBundle, MainDisplayActivity.this);
list.setAdapter(agendaAdapter);
Это переопределенные методы из LoaderCallbacks<Cursor>
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri baseUri = SmartCalProvider.CONTENT_URI;
return new CursorLoader(this, baseUri, args.getStringArray("projection"),
args.getString("selection"), args.getStringArray("selectionArgs"), args.getBoolean("sortOrder") ? args.getString("sortOrder") : null );
}
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
agendaAdapter.swapCursor(arg1);
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
//Not really sure how this works. Maybe I need to fix this here?
agendaAdapter.swapCursor(null);
}
public void makeProviderBundle(String[] projection, String selection, String[] selectionArgs, String sortOrder){
/*this is a convenience method to pass it arguments
* to pass into myBundle which in turn is passed
* into the Cursor loader to query the smartcal.db*/
myBundle = new Bundle();
myBundle.putStringArray("projection", projection);
myBundle.putString("selection", selection);
myBundle.putStringArray("selectionArgs", selectionArgs);
if(sortOrder != null) myBundle.putString("sortOrder", sortOrder);
}
Любой дополнительный код, пожалуйста, не стесняйтесь спрашивать. Еще раз спасибо за любую помощь!
Ответы
Ответ 1
Вам просто нужно немного переместить свой код и вызвать restartLoader
. То есть
-
Когда пользователь нажимает элемент списка, вы каким-то образом изменяете переменную частного экземпляра, которая возвращается в getChosenDate()
(я намеренно неопределенна здесь, потому что вы не указали, что именно возвращает getChosenDate()
).
-
После внесения изменения вызовите getLoaderManager().restartLoader()
на Loader
. Ваши старые данные будут отброшены, а restartLoader
снова вызовет onCreateLoader
. На этот раз getChosenDate()
вернет другое значение (в зависимости от элемента списка, который был нажат), и он должен это сделать. Ваша реализация onCreateLoader
должна выглядеть примерно так:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri baseUri = SmartCalProvider.CONTENT_URI;
makeProviderBundle(
new String[] { "_id, event_name, start_date, start_time, end_date, end_time, location" },
"date(?) >= start_date and date(?) <= end_date",
new String[]{ getChosenDate(), getChosenDate() },
null);
return new CursorLoader(
this,
baseUri,
args.getStringArray("projection"),
args.getString("selection"),
args.getStringArray("selectionArgs"),
args.getBoolean("sortOrder") ? args.getString("sortOrder") : null);
}
Сообщите мне, если это имеет смысл.:)