Если кто-то окажется в подобной ситуации, вот что я сделал:
- Создал класс, который реализует
LoaderCallbacks
и обрабатывает все запросов, которые вы будете выполнятьneed. - Укажите для этого
Context
и Adapter
для вопроса. - Создайте уникальные идентификаторы для каждого запроса, который вы будете использовать (если вы используете
UriMatcher
, может быть какхорошо используйте те же самые) - Создайте удобный метод, который передает запросы в пакет, требуемый для
LoaderCallbacks
- Вот и все :) Я поместил часть своего кода ниже, чтобы показать точночто я сделал
В моем GlobalCallbacks
классе:
public static final String PROJECTION = "projection";
public static final String SELECTION = "select";
public static final String SELECTARGS = "sargs";
public static final String SORT = "sort";
Context mContext;
SimpleCursorAdapter mAdapter;
public GlobalCallbacks(Context context, SimpleCursorAdapter adapter) {
mContext = context;
mAdapter = adapter;
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri contentUri = AbsProvider.customIntMatch(id);
if (contentUri != null) {
return new CursorLoader(mContext, contentUri, args.getStringArray(PROJECTION), args.getString(SELECTION),
args.getStringArray(SELECTARGS), args.getString(SORT));
} else return null;
}
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
mAdapter.swapCursor(arg1);
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
mAdapter.swapCursor(null);
}
И когда я хотел использовать CursorLoader
(Helper.bundleArgs()
- это удобный метод связывания):
scAdapt = new Adapters.NewIndexedAdapter(mHost, getMenuType(),
null, new String[] { "name" }, new int[] { android.R.id.text1 });
getLoaderManager().initLoader(
GlobalCallbacks.GROUP,
Helper.bundleArgs(new String[] { "_id", "name" }),
new GlobalCallbacks(mHost, scAdapt));
setListAdapter(scAdapt);
И в Помощнике:
public static Bundle bundleArgs(String[] projection, String selection, String[] selectionArgs) {
Bundle b = new Bundle();
b.putStringArray(GlobalCallbacks.PROJECTION, projection);
b.putString(GlobalCallbacks.SELECTION, selection);
b.putStringArray(GlobalCallbacks.SELECTARGS, selectionArgs);
return b;
}
Надеюсь, это поможет кому-то еще:)
РЕДАКТИРОВАТЬ
Чтобы объяснить большеполностью:
- Сначала инициализируется адаптер с нулевым значением
Cursor
.Мы не предоставляем Cursor
, потому что GlobalCallbacks
даст адаптеру правильный Cursor
в onLoadFinished(..)
- Далее, мы говорим
LoaderManager
, что мы хотим инициализировать новый CursorLoader
,Мы предоставляем новый экземпляр GlobalCallbacks
(который реализует Loader.Callbacks
), который затем будет отслеживать загрузку курсора.Мы также должны снабдить его адаптером, чтобы он мог заменить новый Cursor
после завершения загрузки.В какой-то момент LoaderManager
(встроенный в ОС) вызовет onCreateLoader(..)
из GlobalCallbacks
и начнет асинхронную загрузку данных Helper.bundleArgs(..)
просто помещает аргументы для запроса в Bundle
(например, проекция столбцов, порядок сортировки, предложение WHERE) - Затем мы устанавливаем
Fragment
s ListAdapter
.Курсор все еще будет нулевым в этой точке, поэтому он покажет знак загрузки или пустое сообщение, пока onLoadFinished()
не будет вызван