天天看點

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

這個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 }, );
            setListAdapter(mAdapter);
            // 此時不顯示清單,因為資料還沒準備好
            setListShown(false);
            // 擷取類加載器的管理者,并初始化
            getLoaderManager().initLoader(, 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(, 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, ).show();
        }

    }

}
           

配置檔案中添權重限

繼續閱讀