理解android中ListFragment和Loader
来源:互联网 发布:tomcat for linux 64 编辑:程序博客网 时间:2024/06/08 15:52
一直以来不知android中Loader怎么用,今天晚上特意花了时间来研究,算是基本上搞明白了,现在把相关的注释和代码发出来,以便笔记和给网友一个参考,错误之处还望大家给我留言,共同进步,这个例子采用的是android事例代码,在其中比较难理解的地方,给出注释,代码如下:
public class MainActivity extends FragmentActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//这是使用的android-support-v4.jar兼容包,如果网友使用的android4.0以上的版本//可不使用,改成相应的方法就行FragmentManager fm = getSupportFragmentManager();if (fm.findFragmentById(android.R.id.content) == null) { CursorLoaderListFragment list = new CursorLoaderListFragment(); fm.beginTransaction().add(android.R.id.content, list).commit(); }}public static class CursorLoaderListFragment extends ListFragmentimplements OnQueryTextListener,OnCloseListener,LoaderCallbacks<Cursor>{SimpleCursorAdapter mAdapter; SearchView mSearchView; String mCurFilter; @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); //设置没有数据显示的默认文本 setEmptyText("No phone numbers"); //设置可由fragment创建的菜单 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); //设置不显示ListView,等待加载完成以后显示 setListShown(false); //初始化加载器 getLoaderManager().initLoader(0, null, this); } public static class MySearchView extends SearchView { public MySearchView(Context context) { super(context); } //正常的SearchView不会清楚搜索文本当SearchView关闭是,所以我们要重写 @Override public void onActionViewCollapsed() { //一当关闭就设置查询文本为空 setQuery("", false); super.onActionViewCollapsed(); } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // TODO Auto-generated method stub //将搜索框加入ActionBar MenuItem item = menu.add("Search"); //设置SearchView的图标 item.setIcon(android.R.drawable.ic_menu_search); //设置ActionItem的显示方式 item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); //使用自定义的SearchView以便更好的控制 mSearchView = new MySearchView(getActivity()); //设置文本改变的监听器 mSearchView.setOnQueryTextListener(this); //设置可删除文本的监听器 mSearchView.setOnCloseListener(this); //设置图标是否显示在文本的旁边,还是作为背景 mSearchView.setIconifiedByDefault(true); //将SearchView作为ActionItem的选项 item.setActionView(mSearchView); } @Override public void onListItemClick(ListView l, View v, int position, long id) { // TODO Auto-generated method stub super.onListItemClick(l, v, position, id); Log.i("FragmentComplexList", "Item clicked: " + id); } static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS, Contacts.CONTACT_PRESENCE, Contacts.PHOTO_ID, Contacts.LOOKUP_KEY, }; @Overridepublic Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {// TODO Auto-generated method stubUri baseUri; if (mCurFilter != null) { baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(mCurFilter)); } else { baseUri = Contacts.CONTENT_URI; } String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" + Contacts.HAS_PHONE_NUMBER + "=1) AND (" + Contacts.DISPLAY_NAME + " != '' ))"; //创建一个新的装载器 return new CursorLoader(getActivity(), baseUri, CONTACTS_SUMMARY_PROJECTION, select, null, Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");}@Overridepublic void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {// TODO Auto-generated method stub//以前一直不明白这句话的意思,只知道是交换一个新的Cursor,返回一个旧的Cursor, //现在大概明白了,在这里将新的Cursor交给mAdapter,以便ListView能够显示,//细心的朋友可能会发现,在创建mAdapter的时候传入的Cursor为空,其实是没有数据//的,在这里加载好了,就把这个新的Curosr对象传进去,让ListView//显示,这个地方很多网友搞不明白,这里多解释一下mAdapter.swapCursor(arg1);//现在显示ListView if (isResumed()) { setListShown(true); } else { setListShownNoAnimation(true); }}@Overridepublic void onLoaderReset(Loader<Cursor> arg0) {// TODO Auto-generated method stub//当这个Loader被重置时,也就是调用了restartLoader方法是,使以前的数据无效mAdapter.swapCursor(null);}@Overridepublic boolean onClose() {// TODO Auto-generated method stubif (!TextUtils.isEmpty(mSearchView.getQuery())) { mSearchView.setQuery(null, true); } return true;}@Overridepublic boolean onQueryTextChange(String newText) {String newFilter = !TextUtils.isEmpty(newText) ? newText : null; if (mCurFilter == null && newFilter == null) { return true; } if (mCurFilter != null && mCurFilter.equals(newFilter)) { return true; } mCurFilter = newFilter; getLoaderManager().restartLoader(0, null, this); return true;}@Overridepublic boolean onQueryTextSubmit(String query) {// TODO Auto-generated method stubreturn true;}}}
- 理解android中ListFragment和Loader
- Android ListFragment
- android Listfragment
- Android ListFragment
- Android之Loader理解
- Android之Loader理解
- Android之Loader理解
- Android之Loader理解
- Android之Loader理解
- 深入理解Android中Loader、AsyncTaskLoader、CursorLoader、LoaderManager
- webpack中loader和plugin的概念理解
- loader中contentLoaderInfo的理解
- Android ListFragment 中给LinearLayout添加点击事件
- ListFragment+CheckedTextView和ListFragment+CheckBox两种多选效果
- 【Android 开发教程】ListFragment
- Android ListFragment实例Demo
- Android ListFragment使用
- Android自定义ListFragment
- C# 打开网页兼容Windows8.1的方式
- 应该在什么时候使用Hadoop
- 数据库基本概念
- c\c++ 复习基础要点04 C与C++程序的内存结构的不同
- Java实现--替换文本文件中所有符合条件的字符串
- 理解android中ListFragment和Loader
- 在android4.2中,Google更换了android的蓝牙协议栈,从Bluez换成Bluedroid,我也是初涉这个方面,顺便记录一下。 http://source.android.com/d
- 正确完整的快排,上一篇错误
- 黑马程序员C#学习在路上--程序结构
- linux系统(centos)下安装JDK,Tomcat详细教程!!!
- 黑马程序员C#学习在路上--C# 程序的通用结构
- 黑马程序员C#学习在路上--访问修饰符
- 黑马程序员C#学习在路上--类成员
- OCP-1Z0-052-V8.02-165题