1. 程式人生 > >Android Api Demos登頂之路(四十五)Loader-->Cursor

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

adapt lists 清空 function icon 創建 nal pat lines

這個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