首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android CursorLoader 與 LoaderManager 串接 CursorAdapter 完整流程

     編輯:程式設計綜合問答

Android 3.0 (API 11) 引入 LoaderManager 與 CursorLoader,解決舊版 managedQuery 在 UI 執行緒查詢資料庫導致 ANR 的問題。正確串接 CursorAdapter 需遵循「建立 Adapter → 初始化 Loader → 實作 LoaderCallbacks 三大回呼」的標準流程。

完整實作步驟

1. 建立 CursorAdapter 實例

// 使用 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);

2. 初始化 Loader

getLoaderManager().initLoader(LOADER_ID, null, this);
// this 實作 LoaderManager.LoaderCallbacks<Cursor>

3. 實作 LoaderCallbacks 三方法

@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);
}

關鍵優勢

  • 非同步載入:查詢在背景執行緒,不阻塞 UI。
  • 生命週期感知:Activity/Fragment 重建時自動保留資料,避免重複查詢。
  • 資料觀察:底層資料變更時自動觸發重新查詢。

遵循此標準模式,即能高效、穩健地在 ListView/RecyclerView 中顯示資料庫內容。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved