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 }, 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-->Cursor