一直以来不知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;}}}



更多相关文章

  1. android 弹出的软键盘遮挡住EditText文本框的解决方案
  2. Android视图加载到窗口的过程分析
  3. Android之Android apk动态加载机制的研究(二):资源加载和activity生
  4. Android - 文本框的输入法控制和默认焦点设置
  5. 采用跑马灯形式显示文本
  6. Android点击EditText文本框之外任何地方隐藏键盘的解决办法
  7. android纹理图片的加载与修改
  8. Android图片加载与缓存开源框架:Android Glide
  9. Android Handler 异步消息处理机制的妙用 创建强大的图片加载类

随机推荐

  1. Android权限问题 及 APP应用图标
  2. Android使用TextView实现跑马灯效果
  3. 解决:Android中 Error generating final a
  4. Android(安卓)Studio无线调试app之Androi
  5. 配置新的product(译)——android编译系统
  6. android中的线程池
  7. 收藏Android下bitmap内存限制OUT OF MEMO
  8. ADT在线安装(http://dl-ssl.google.com/an
  9. android ImageView src属性不支持.9图
  10. android之interpolator的用法详解