簡體   English   中英

Android:來自Database / ContentProvider / ContentResolver的可擴展ListView適配器

[英]Android : Expandable ListView Adapter from Database / ContentProvider / ContentResolver

我正在嘗試構建一個Expandable ListView。

我暫時有一個包含3個表的數據庫,我需要從中提取內容(並更新一些內容)。 另外,我使用自己的內容提供程序和活動的內容解析器與我的數據庫進行交互。 將來,關於Virgil Dobjanschi的Rest Design Pattern(或者至少我要嘗試...),我將添加一些SOAP調用以將我的語言環境數據庫同步到遠程數據庫。

我的第一個問題是:我的ELV應該使用哪個適配器?

我從BaseExpandableListAdapter開始,但是我注意到我總是必須自己進行查詢才能提取和更新數據。 例如 :

        EditText et;

        et = (EditText) convertView.findViewById(R.id.explist_qty);
        et.setOnClickListener(mController);

        Cursor cursor = _context.getContentResolver().query(
                MyContentProvider.getUri(QuantityTable.TABLE_QUANTITY), 
                new String[]{ QuantityTable.COLUMN_QUANTITY }, 
                QuantityTable.COLUMN_STOCK_ID +"=="+groupPosition, null, null);
        String qty = cursor.getString(cursor.getColumnIndexOrThrow((QuantityTable.COLUMN_QUANTITY)));

        et.setText(qty);

我認為這不是正確的選擇,因為我需要所有功能都使用游標。 這就是為什么我尋找CursorTreeAdapter的原因,但是我在某個地方經常使用它來避免生成Content Provider / Resolver模式。 現在我肯定迷路了,需要您的幫助。

有關信息,我的ELV將TextView顯示為標題,並將一些EditTexts / Buttons顯示為子級。 我需要按鈕來更新EditText和2個數據庫(使用我的Content Provider的語言環境,以及使用SOAP調用的遠程語言)。

這是我的第二個問題:關於語言環境數據庫,如何使我的視圖刷新自己?

我已經聽說過Observer / Observable設計模式,但是我不確定它可以用數據庫完成,我可能錯了。

我正在學習Android,因此對於像我這樣的菜鳥來說,很難理解一切進展和良好實踐。

謝謝大家

我找到了完全適合我想要的解決方案。

ELV的適配器顯然是CursorTreeAdapter,當與數據庫一起使用時,它是完美的選擇。 由於使用了光標加載器,我可以為適配器供電。 我正在使用活動加載程序管理器,並初始化了加載程序。 我的活動實現了LoaderManager.LoaderCallbacks,因此我擁有3種方法onCreateLoader(),onLoadFinished()和onLoaderReset()。

在onCreateLoader()中,我通過鏈接到自定義內容提供程序的Content Resolver進行查詢,並將其附加到自定義的CursorLoader(我返回),后者偵聽特定的URI。 如果表上有任何更改,我的內容提供者會通知此URI,因此CursorLoader知道它必須重新加載自己。

onLoadFinished()僅將當前光標設置為適配器,而onLoaderReset()僅將null設置為適配器。

這樣,所有內容都在后台線程中工作,不會凍結UI,並且每次需要時都會自動刷新內容。

那里有很多工作,很難在幾行中解釋。 大約有數千行代碼,所以我不能在那里復制/粘貼它。 我只是回來提供我的解決方案,如果它可以幫助某人。 請不要猶豫,請我解釋一下,我會盡力回答。

@Override
    protected Cursor getChildrenCursor(Cursor groupCursor) {
        final int productSubCategoryId = groupCursor.getInt(groupCursor.getColumnIndex(DbVar.ID));
        Cursor childCursor = null;
        try {
            final String sortOrder = DbVar.PRODUCT_NAME + " COLLATE LOCALIZED ASC";
            final CursorLoader cursorLoader = new CursorLoader(
                    shoppingListFragment.getActivity(),
                    PGContentProvider.CONTENT_URI_SHOPPING_LIST_TABLE,
                    ShoppingListTable.FIELD_LIST,
                    "(" + DbVar.PRODUCT_SUB_CATEGORY_ID + "=?)",
                    new String[]{ productSubCategoryId + ""}, sortOrder);
            cursorLoader.registerListener(0, this);
            childCursor = cursorLoader.loadInBackground();
            childCursor.moveToFirst();

        } catch (final Exception e) {
            e.printStackTrace();
        }

        return childCursor;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM