1.初始化Fragment
(1)创建SimpleCursorAdapter对象
(2)调用LoadManager.initLoader方法创建一个新的Loader对象,或使用已经存在的Loader对象
2.Fragment与ActionBar关联
3.重新创建Loader对象,调用restartLoader方法等
4.创建新的Loader对象,实现onCreateLoader方法 ,创建并返回CursorLoader对象
5.处理装载完的数据,在onLoaderFinshed方法中调用Adapter的swapCursor方法指定新的Cursor对象
6.释放资源
代码如下:
package com.gst.user.application;
import android.app.ListFragment;
import android.app.LoaderManager;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.SearchView;
import android.widget.SimpleCursorAdapter;
/**
* Created by user on 12/25/15.
*/
public class ContactFragment extends ListFragment implements SearchView.OnQueryTextListener,LoaderManager.LoaderCallbacks<Cursor>{
SimpleCursorAdapter mAdapter;
String mCurFilter;
static final String[] CONTACTS_SUMMARY_PROJECTION=new String[]{
ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.CONTACT_STATUS, ContactsContract.Contacts.CONTACT_PRESENCE,
ContactsContract.Contacts.PHOTO_ID, ContactsContract.Contacts.LOOKUP_KEY,
};
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setEmptyText("没有该联系人");
setHasOptionsMenu(true);
mAdapter=new SimpleCursorAdapter(getActivity(),android.R.layout.simple_list_item_2,
null,new String[]{ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.CONTACT_STATUS},
new int[]{android.R.id.text1,android.R.id.text2},0);
setListAdapter(mAdapter);
getLoaderManager().initLoader(0,null,this);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
MenuItem item=menu.add("搜索");
item.setIcon(R.drawable.other);
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
SearchView searchView=new SearchView(getActivity());
searchView.setOnQueryTextListener(this);
item.setActionView(searchView);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri baseUri;
if (mCurFilter!=null){
baseUri=Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_FILTER_URI,
Uri.encode(mCurFilter));
}else {
baseUri= ContactsContract.Contacts.CONTENT_URI;
}
String select="(("+ ContactsContract.Contacts.DISPLAY_NAME+" NOT NULL) AND ("
+ContactsContract.Contacts.HAS_PHONE_NUMBER+"=1) AND (" +
ContactsContract.Contacts.DISPLAY_NAME+" != ''))";
return new CursorLoader(getActivity(),baseUri,CONTACTS_SUMMARY_PROJECTION,select,null,
ContactsContract.Contacts.DISPLAY_NAME+" COLLATE LOCALIZED ASC");
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mAdapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
@Override
public boolean onQueryTextSubmit(String query) {
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
mCurFilter= TextUtils.isEmpty(newText)? null:newText;
getLoaderManager().restartLoader(0,null,this);
return true;
}
}