一直以来不知Android中Loader怎么用,今天晚上特意花了时间来研究,算是基本上搞明白了,现在把相关的注释和代码发出来,以便笔记和给网友一个参考,错误之处还望大家给我留言,共同进步,这个例子采用的是android事例代码,在其中比较难理解的地方,给出注释,代码如下:

public class MainActivity extends FragmentActivity {  
  
    @Override  
    protected 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 ListFragment  
        implements 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,  
        };  
          
        @Override  
        public Loader<Cursor> onCreateLoader(  
                int arg0, Bundle arg1) {  
            // TODO Auto-generated method stub  
            Uri 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");  
        }  
  
        @Override  
        public 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);  
            }  
        }  
  
        @Override  
        public void onLoaderReset(Loader<Cursor> arg0) {  
            // TODO Auto-generated method stub  
            //当这个Loader被重置时,也就是调用了restartLoader方法是,使以前的数据无效  
            mAdapter.swapCursor(null);  
        }  
  
        @Override  
        public boolean onClose() {  
            // TODO Auto-generated method stub  
            if (!TextUtils.isEmpty(mSearchView.getQuery())) {  
                mSearchView.setQuery(null, true);  
            }  
            return true;  
        }  
  
        @Override  
        public 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;  
        }  
  
        @Override  
        public boolean onQueryTextSubmit(String query) {  
            // TODO Auto-generated method stub  
            return true;  
        }  
    }  
}  

  

理解android中ListFragment和Loader的更多相关文章

  1. 【转】Android菜单详解——理解android中的Menu--不错

    原文网址:http://www.cnblogs.com/qingblog/archive/2012/06/08/2541709.html 前言 今天看了pro android 3中menu这一章,对A ...

  2. 深入理解Android中View

    文章目录   [隐藏] 一.View是什么? 二.View创建的一个概述: 三.View的标志(Flag)系统 四.MeasureSpec 五.几个重要方法简介 5.1 onFinishInflate ...

  3. Android菜单详解(一)——理解android中的Menu

    前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至 ...

  4. 深入理解Android中ViewGroup

    文章目录   [隐藏] 一.ViewGroup是什么? 二.ViewGroup这个容器 2.1 添加View的算法 2.1.1 我们先来分析addViewInner方法: 2.1.2 addInArr ...

  5. 彻底理解 Android 中的阴影

    如果我们想创造更好的 Android App,我相信我们需要遵循 Material Design 的设计规范.一般而言,Material Design 是一个包含光线,材质和投影的三维环境.如果我们想 ...

  6. 一个demo让你彻底理解Android中触摸事件的分发

    注:本文涉及的demo的地址:https://github.com/absfree/TouchDispatch 1. 触摸动作及事件序列 (1)触摸事件的动作 触摸动作一共有三种:ACTION_DOW ...

  7. 绝对让你理解Android中的Context

    这个问题是StackOverFlow上面一个热门的问题What is Context in Android? 整理这篇文章的目的是Context确实是一个非常抽象的东西.我们在项目中随手都会用到它,但 ...

  8. 理解Android中的注解与反射

    反射 Java反射(Reflection)定义 Java反射机制是指在运行状态中 对于任意一个类,都能知道这个类的所有属性和方法:对于任何一个对象,都能够调用它的任何一个方法和属性: 这样动态获取新的 ...

  9. 【转】深入理解Android中的SharedPreferences

    SharedPreferences作为Android中数据存储方式的一种,我们经常会用到,它适合用来保存那些少量的数据,特别是键值对数据,比如配置信息,登录信息等.不过要想做到正确使用SharedPr ...

随机推荐

  1. PyCharm+selenium环境搭建报错:Traceback (most recent call last): TypeError: 'module' object is not callable

    环境搭建好后,代码如下: from selenium import webdriverdriver = webdriver.chrome()driver.get("http://www.ba ...

  2. Vue 混入(mixins)

    详细参考官方文档 基础 混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. ...

  3. 牛客OI周赛8-提高组A-用水填坑

    牛客OI周赛8-提高组A-用水填坑 题目 链接: https://ac.nowcoder.com/acm/contest/403/A 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制: ...

  4. [问题解决]Fresco设置圆角效果不生效问题探究

    [问题解决]Fresco设置圆角效果不生效问题探究 /** * Created by diql on 2017/2/21 11:07:04. */ 问题 在View中设置: fresco:rounde ...

  5. box-shadow向元素添加阴影效果

    div{ box-shadow: 10px 10px 5px #888888;} 语法:box-shadow: h-shadow v-shadow blur spread color inset; 值 ...

  6. struts2 基本流程

    一.配置过程 1.在web.xml中配置过滤器 <filter> <filter-name>StrutsPrepareAndExecuteFilter</filter-n ...

  7. JQuery Div scrollTop ScrollHeight

    jQuery 里和滚动条有关的概念很多,但是有三个属性和滚动条的拖动有关,就是:scrollTop.scrollLeft.scrollHeight.其中 scrollHeight 属性,互联网上几乎搜 ...

  8. npm安装过程中的win环境变量设置

    我们要先配置npm的全局模块的存放路径以及cache的路径,例如我希望将以上两个文件夹放在NodeJS的主目录下,便在NodeJs下建立”node_global”及”node_cache”两个文件夹. ...

  9. CC2530串口工作

    前言 嘿嘿,我只是写给我自己的一篇博客,今天研究了一天的CC2530,感觉好累,虽然是已经落伍的技术了,但是我觉得不要小看它,还是能够学到点东西的,随着学习的深入,渐渐感觉有点突破的苗头了!哈哈 CC ...

  10. Tomcat源码分析——Session管理分析(上)

    前言 对于广大java开发者而已,对于J2EE规范中的Session应该并不陌生,我们可以使用Session管理用户的会话信息,最常见的就是拿Session用来存放用户登录.身份.权限及状态等信息.对 ...