CursorLoader的使用

来源:互联网 发布:mysqldump备份数据库 编辑:程序博客网 时间:2024/05/21 12:08
之前经常看些大牛的博客, 从中受益良多,也帮我解决了很多问题, 一直想自己开一个博客, 于是就有了这第一篇文章, 嘿嘿, 初次写博客, 写的不好的地方大家见谅哈,如有不足或错误的地方,欢迎指出。 废话不多说, 进入正题:
在Android 3.0 API中引入了Loader加载器, 它主要作用就是用于异步加载数据,当数据源改变时可以实时刷新(可以直接理解为Observer模式),本章主要讲的是Loader的孙子(CursorLoader)的基本使用(因为它简单)

CursorLoader顾名思义, 主要是用于加载Povider提供的数据,上代码, 代码中注释应该还算详细:

package com.ljj.loaderdata;import android.database.Cursor;import android.net.Uri;import android.support.v4.app.LoaderManager;import android.support.v4.content.CursorLoader;import android.support.v4.content.Loader;import android.support.v4.widget.CursorAdapter;import android.support.v4.widget.SimpleCursorAdapter;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.ListView;public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {    private ListView dataList;    private LoaderManager mManager;    private SimpleCursorAdapter mAdapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mManager = getSupportLoaderManager();        // 偷懒, 直接使用系统自带的item布局        mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null,                new String[]{"number"}, new int[]{android.R.id.text1}, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);        initView();        mManager.initLoader(                1,      // 加载器的标识, 如果不存在此加载器, 则会触发onCreateLoader创建, 如果存在则复用                null,   // 可选的参数, 用于加载器初始化时                this);    }    private void initView() {        dataList = (ListView) findViewById(R.id.data_list);        dataList.setAdapter(mAdapter);    }    // 创建并返回一个新的loader(当指定的loader id不存在时才会调用)    /**     *     * @param id    指定的加载器的id     * @param args  初始化时传入的参数     * @return     */    @Override    public Loader<Cursor> onCreateLoader(int id, Bundle args) {        return new CursorLoader(MainActivity.this, Uri                .parse("content://call_log/calls"), new String[] {                "_id", "number" }, null, null, null);    }    // 当加载器完成了他的装载过程后被调用    @Override    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {        // 将加载成功的数据替换到adapter中显示, (类似于notifyDataSetChanged())        mAdapter.swapCursor(data);    }    /**     * 当Loader被重置(比如查询其他字段)从而使之前的数据无效时, 调用此方法清除上一次的数据,     * 当数据被清除之后, GC才可以清除数据      */    @Override    public void onLoaderReset(Loader<Cursor> loader) {        mAdapter.swapCursor(null);    }}


1 0
原创粉丝点击