如果有人发现自己处于类似情况,这就是我所做的:
- 创建了一个实现
LoaderCallbacks
和处理您需要的所有查询的类。
- 提供这个和有
Context
问题的Adapter
。
- 为您将使用的每个查询创建唯一 ID(如果您使用 a
UriMatcher
,不妨使用相同的 ID)
- 制作一个方便的方法,将查询传输到所需的包中
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
首先,初始化一个带有 null 的适配器。我们不提供它,Cursor
因为它GlobalCallbacks
会为适配器提供正确Cursor
的onLoadFinished(..)
- 接下来,我们告诉
LoaderManager
我们要初始化一个新的CursorLoader
. 我们提供了一个新GlobalCallbacks
实例(它实现了Loader.Callbacks
),然后它将监视游标的加载。我们还必须为它提供适配器,这样它就可以在Cursor
完成加载后换入新的。在某些时候,LoaderManager
(内置于操作系统中)将调用onCreateLoader(..)
并GlobalCallbacks
开始异步加载数据
Helper.bundleArgs(..)
只需将查询的参数放入一个Bundle
(例如列投影、排序顺序、WHERE 子句)
- 然后我们设置
Fragment
's ListAdapter
。此时光标仍将为空,因此它将显示加载符号或空消息,直到onLoadFinished()
被调用