CursorLoader的使用

之前经常看些大牛的博客, 从中受益良多,也帮我解决了很多问题, 一直想自己开一个博客, 于是就有了这第一篇文章, 嘿嘿, 初次写博客, 写的不好的地方大家见谅哈,如有不足或错误的地方,欢迎指出。 废话不多说, 进入正题:
在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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值