`
abc20899
  • 浏览: 928579 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Loader和Fragment使用示例代码

阅读更多
Loader和Fragment都是Android 3.0的新特性,有关Fragment相关的内容Android开发网已经用了多个篇幅介绍,而Loader相关的大家可以通过 LoaderManager - Android 3.0新特性 一文了解Loader的作用和结构,下面就以一个简单的工程示例代码了解下Loader。

public class FragmentListCursorLoader extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        FragmentManager fm = getFragmentManager(); //获取FragmentManager这个服务实例

        if (fm.findFragmentById(android.R.id.content) == null) { //这个资源是android内部的布局,注意是android.R
            CursorLoaderListFragment list = new CursorLoaderListFragment();
            fm.beginTransaction().add(android.R.id.content, list).commit();
        }
    }

    public static class CursorLoaderListFragment extends ListFragment
            implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Cursor> {

        SimpleCursorAdapter mAdapter; //这里使用简单cursor适配器绑定数据库

        String mCurFilter;

        @Override public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);

            setEmptyText("No phone numbers");

            setHasOptionsMenu(true); //显示actionbar,如果不明白看android123以前的文章

            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);

            getLoaderManager().initLoader(0, null, this);
        }

        @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
            MenuItem item = menu.add("Search");
            item.setIcon(android.R.drawable.ic_menu_search);
            item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
            SearchView sv = new SearchView(getActivity());
            sv.setOnQueryTextListener(this);
            item.setActionView(sv);
        }

        public boolean onQueryTextChange(String newText) {
            mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;
            getLoaderManager().restartLoader(0, null, this);
            return true;
        }

        @Override public boolean onQueryTextSubmit(String query) {
            return true;
        }

        @Override public void onListItemClick(ListView l, View v, int position, long 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,
        };

        public Loader<Cursor> onCreateLoader(int id, Bundle args) { //这里的处理是异步的
            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");
        }

        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
            mAdapter.swapCursor(data); //处理完成
        }

        public void onLoaderReset(Loader<Cursor> loader) {
            mAdapter.swapCursor(null);
        }
    }
}


分享到:
评论

相关推荐

    Fragment+Loader实现异步加载

    以"**MyFragLoaderTest**"为例,这个可能是测试项目或者一个具体的Fragment示例,它展示了如何在Fragment中使用Loader来实现异步加载。在这个测试中,开发者可能创建了一个自定义的Loader,用于从特定的数据源加载...

    Google Android SDK开发范例大全——示例代码

    9. **UI设计和布局**:可能涉及到XML布局文件的创建和解析,以及各种视图组件(如Button、TextView、ImageView等)的使用和自定义。 10. **权限管理**:Android系统对敏感操作进行了权限控制。这部分可能介绍如何在...

    Fragment demo仿QQ主界面

    - 可以通过在XML布局中使用&lt;fragment&gt;标签或者在代码中动态添加来实现。 5. **Fragment的通信**: - Fragment之间以及Fragment与Activity之间的通信是关键。可以使用回调接口、EventBus、LiveData、ViewModel等...

    Android 异步加载显示 Loader 自定义Loader

    示例代码片段: ```java public class CustomImageLoader extends AsyncTaskLoader&lt;List&lt;Bitmap&gt;&gt; { // 实现加载逻辑... } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate...

    通过Compatibility Package低版本使用Fragment

    在`src`目录下,可能包含了示例代码或库的源码,供开发者学习和参考,理解Fragment的实现细节和如何在实践中使用它们。 在`docs`目录中,通常会有详细的API文档和开发者指南,这些文档可以帮助开发者深入理解...

    Android 使用Loader 读取联系人

    7. **Fragment的Loader支持**:在Fragment中使用Loader,可以更好地管理数据加载和Fragment的生命周期,特别是在Fragment的重建过程中,Loader能够恢复之前的状态,避免重复加载数据。 在"loader_test"这个压缩包...

    android loader异步装载数据

    5. **高效的数据更新**:由于Loader会在数据变化时自动触发加载,所以聊天界面只需专注于展示数据,无需手动检查和刷新,这提高了代码的可维护性和性能。 在"TalkDemo"这个示例项目中,我们可以预期看到以下关键...

    Android-单个Activity多个Fragment实现微信Android客户端

    在这个项目中,`WeChatDemo-master`压缩包文件包含了一个模仿微信功能的示例代码,让我们深入探讨这个设计模式和相关知识点。 1. **Activity与Fragment的关系**: - Activity是Android应用中的基本组件,负责处理...

    Andorid例子源码仿百度贴吧APP应用的Fragment

    这个“Andorid例子源码仿百度贴吧APP应用的Fragment”提供了关于如何模仿百度贴吧应用中的Fragment使用方式的示例。下面将详细探讨Fragment在Android应用中的重要性和如何实现。 Fragment的概念起源于Android 3.0...

    Universal-Image-Loader使用demo

    `universal-image-loader-demo`这个项目可能包含了以上所有功能的示例代码,通过查看和运行这个项目,可以更深入地理解和学习如何在实际项目中应用Universal Image Loader。通过实践和调试,你将更好地掌握这个强大...

    LoaderDemo源代码

    4. **LiveData和ViewModel**:虽然Loader是Android早期的解决方案,但现代Android开发更倾向于使用 LiveData 和 ViewModel。不过,Loader的生命周期感知特性与LiveData有相似之处,都能够在组件存活期间保持数据的...

    android:安卓示例代码

    在实际学习和使用这些示例代码时,开发者可以期待以下内容: 1. **基础组件的使用**:例如Activity、Fragment、Intent等,这些都是构建Android用户界面的基础。 2. **布局设计**:XML布局文件的编写,包括线性布局...

    Android-AndroidLoaderDemo演示CursorLoader和AsyncTaskLoader使用实例

    2. 在Activity或Fragment中初始化Loader并使用相同的LoaderManager.LoaderCallbacks接口。 3. 示例代码: ```java public class MyAsyncTaskLoader extends AsyncTaskLoader[]&gt; { @Override protected String[] ...

    Android应用源码之ViewPager+Fragment侧滑选项卡,浏览器控件,两次退出.zip

    这个源码示例对于学习Android应用开发,尤其是掌握ViewPager、Fragment和WebView的使用,以及实现常见应用功能,具有很高的参考价值。开发者可以通过研究源码,加深对这些组件的理解,并将它们运用到自己的项目中。

    Android Loader的使用以及手机通讯录的获取方法

    虽然示例代码是用Java编写的,但这里也提到了Kotlin的实现方式。Kotlin中,可以使用伴生对象来存储常量,如`LOADER_ID`和`PHONE_PROJECTION`。 总的来说,Loader为Android应用提供了一种高效、优雅的方式来处理...

    Android代码-.samples

    在Android开发领域,`.samples`通常指的是包含示例代码或项目的集合,用于帮助开发者更好地理解和学习Android应用程序的构建过程。这个名为"Android代码-.samples"的压缩包很可能包含了多个具体的Android应用示例...

    ViewPager+Fragment取消预加载(延迟加载)

    在实际项目中,你可能还需要考虑如何优化Fragment的加载过程,例如使用Loader或者AsyncTask来异步加载数据,避免阻塞UI线程。同时,对于资源的释放也应做好管理,防止内存泄漏。 通过以上方法,我们可以有效地控制...

    FragmentLoader

    在`FragmentDemo`这个示例项目中,我们可以看到如何将上述步骤应用于实际的代码实现。开发者通常会在Fragment中创建一个自定义Loader,比如`FragmentDataLoader`,然后在`onActivityCreated()`中初始化Loader,传递...

    Universal_Image_Loader实例

    Universal_Image_Loader是一款在Android平台上广泛使用的开源图片加载库,由Sergey Tarasevich开发,它提供了强大的图片缓存功能,支持多种图片格式,同时具备图片的异步加载、内存管理、错误处理和动画效果等特性。...

    android listview 示例源代码

    本示例源代码提供了关于Android ListView的详细实现,帮助开发者掌握如何有效地使用和定制ListView。 首先,ListView的基本使用包括以下几个关键步骤: 1. **布局文件配置**:在XML布局文件中添加ListView元素,...

Global site tag (gtag.js) - Google Analytics