Android Api Demos登頂之路(四十五)Loader-->Cursor

來源:互聯網
上載者:User

標籤:基礎上   base   als   asa   callbacks   layout   extc   read   bar   

這個demo示範了類載入器的用法。關於類載入器的使用我們在前面的demo中已經介紹過了 在此再小小的複習一下。

類載入器的使用步驟:
* 1.擷取類載入器的管理者LoaderManager manager = tent.getLoaderManager();
* 2.初始化loader
MainActivity

public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        FragmentManager fm = getFragmentManager();        // 推斷一下假設activity中沒有載入視圖,則建立新的視圖並載入        if (fm.findFragmentById(android.R.id.content) == null) {            CursorLoaderListFragment frg = new CursorLoaderListFragment();            fm.beginTransaction().add(android.R.id.content, frg).commit();        }    }    public class CursorLoaderListFragment extends ListFragment implements            OnQueryTextListener, OnCloseListener {        private SimpleCursorAdapter mAdapter;        private MySearchView mySearchView;        private String mCurrentFilter;        @Override        public void onActivityCreated(Bundle savedInstanceState) {            super.onActivityCreated(savedInstanceState);            // 當查詢結果為空白,listview中無顯示內容時,設定顯示的提示資訊            setEmptyText("No phone numbers!");            // 設定顯示actionbar            setHasOptionsMenu(true);            mAdapter = new SimpleCursorAdapter(getActivity(),                    android.R.layout.simple_list_item_2, null, new String[] {                            Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS },                    new int[] { android.R.id.text1, android.R.id.text2 }, 0);            setListAdapter(mAdapter);            // 此時不顯示列表。由於資料還沒準備好            setListShown(false);            // 擷取類載入器的管理者,並初始化            getLoaderManager().initLoader(0, null, myLoader);        }        // 定義要查詢的內容        private final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {                Contacts._ID, Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS,                Contacts.CONTACT_PRESENCE, Contacts.PHOTO_ID,                Contacts.LOOKUP_KEY };        private LoaderCallbacks<Cursor> myLoader = new LoaderCallbacks<Cursor>() {            @Override            public Loader<Cursor> onCreateLoader(int id, Bundle args) {                Uri baseUri;                if (mCurrentFilter != null) {                    // 假設查詢條件不為空白,則在原來的基礎上新增查詢條件                    baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,                            Uri.encode(mCurrentFilter));                } else {                    baseUri = Contacts.CONTENT_URI;                }                // 定義查詢條件                String selection = "((" + Contacts.DISPLAY_NAME                        + " NOTNULL) AND (" + Contacts.HAS_PHONE_NUMBER                        + "=1) AND (" + Contacts.DISPLAY_NAME + " != ‘‘ ))";                return new CursorLoader(getActivity(), baseUri,                        CONTACTS_SUMMARY_PROJECTION, selection, null,                        Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");            }            @Override            public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {                // 載入完畢交換查詢結果                mAdapter.swapCursor(cursor);                //假設Fragment處於恢複狀態中則顯示載入動畫,否則不顯示載入動畫                //資料準備完畢,顯示列表                if(isResumed()){                    setListShown(true);                }else{                    setListShownNoAnimation(true);                }            }            @Override            public void onLoaderReset(Loader<Cursor> loader) {                //重新啟動載入器時首先要確保清除舊的資料                mAdapter.swapCursor(null);            }        };        // 自己定義搜尋視圖        public class MySearchView extends SearchView {            public MySearchView(Context context) {                super(context);            }            // 正常情況下serchView在收縮的時候是不會清空當中的內容的            // 這裡我們須要重寫收縮時的方法,在收縮時清空內容            @Override            public void onActionViewCollapsed() {                // 僅僅更新查詢內容不提交查詢                setQuery("", false);                super.onActionViewCollapsed();            }        }        @Override        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {            super.onCreateOptionsMenu(menu, inflater);            MenuItem item = menu.add("search");            item.setIcon(android.R.drawable.ic_menu_search);            // 設定item的顯示方式            item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM                    | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);            mySearchView = new MySearchView(getActivity());            // 監聽查詢內容的變化            mySearchView.setOnQueryTextListener(this);            mySearchView.setOnCloseListener(this);            //設定搜尋方塊預設自己主動縮小為表徵圖            mySearchView.setIconifiedByDefault(true);            //設定item的動作視圖,按下前僅僅顯示小表徵圖。按下後展開顯示            item.setActionView(mySearchView);        }        @Override        public boolean onQueryTextSubmit(String query) {            // 不必關心是否提交。在查詢內容發生變化時就已經作出了處理            return true;        }        @Override        public boolean onQueryTextChange(String newText) {            String newFilter = !TextUtils.isEmpty(newText) ?

newText : null; // 當查詢條件沒有變化時,不做不論什麼事,僅僅是返回true。

if (mCurrentFilter == null && newFilter == null) { return true; } if (mCurrentFilter != null && mCurrentFilter.equals(newFilter)) { return true; } mCurrentFilter = newFilter; // 重新啟動載入器 getLoaderManager().restartLoader(0, null, myLoader); return true; } @Override public boolean onClose() { // 將查詢內容置空 if (!TextUtils.isEmpty(mySearchView.getQuery())) { mySearchView.setQuery(null, true); } return true; } @Override public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Toast.makeText(getActivity(), "Item clicked:" + id, 0).show(); } }}

設定檔裡加入許可權

<uses-permission android:name="android.permission.READ_CONTACTS"/>

Android Api Demos登頂之路(四十五)Loader--&gt;Cursor

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.