Android 3.0 (API 11) 引入 LoaderManager 與 CursorLoader,解決舊版 managedQuery 在 UI 執行緒查詢資料庫導致 ANR 的問題。正確串接 CursorAdapter 需遵循「建立 Adapter → 初始化 Loader → 實作 LoaderCallbacks 三大回呼」的標準流程。
// 使用 SimpleCursorAdapter 或自訂 CursorAdapter
mAdapter = new SimpleCursorAdapter(
getActivity(),
android.R.layout.simple_list_item_2,
null, // 初始 cursor 為 null
new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS },
new int[] { android.R.id.text1, android.R.id.text2 },
0 // flags
);
listView.setAdapter(mAdapter);
getLoaderManager().initLoader(LOADER_ID, null, this);
// this 實作 LoaderManager.LoaderCallbacks<Cursor>
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// 回傳 CursorLoader,指定 ContentProvider URI、投影欄位、選擇條件等
return new CursorLoader(
getActivity(),
CONTENT_URI,
PROJECTION,
SELECTION,
SELECTION_ARGS,
SORT_ORDER
);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// 查詢完成,將新 cursor 交給 adapter
mAdapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
// Loader 重置時清空 adapter 參考
mAdapter.swapCursor(null);
}
遵循此標準模式,即能高效、穩健地在 ListView/RecyclerView 中顯示資料庫內容。