一直以来不知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(安卓)高级控件(二)
  2. 关于设置android:imeOptions属性无效的解决办法
  3. Android设置TextView的渐变颜色、方向和动画效果
  4. android 弹出的软键盘遮挡住EditText文本框的解决方案
  5. Android中使用indexablerecyclerview以及右侧字母索引基本使用
  6. Android之Http网络编程(一)
  7. android imeOptions
  8. Android(安卓)控件四 EditText 控件
  9. 关于Android横竖屏切换的解决方法

随机推荐

  1. 虚拟机ping不通的几种原因及解决办法
  2. error: Pulling is not possible because
  3. 报错内容:1045 - Access denied for user
  4. 0519作业localstorage
  5. 想做一个网站,需要学些什么?
  6. 百度会对每个页面单独评级
  7. 初学者如何画好耳朵?二次元耳朵画法教程
  8. 插画构图如何学习?插画构图技巧!
  9. Android(安卓)ListView的item点击无响应
  10. android 录音和播放