您的位置:首页 > 移动开发 > Android开发

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

2015-08-23 04:27 501 查看
这个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"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: