给ListView异步加载Cursor

LoaderManager
每个Activity或者Fragment只有一个LoaderManager,它可以根据前两者的生命周期来管理若干个Loader。

LoaderManager.LoaderCallbacks
它提供三个接口和LoaderManager进行互动:onCreateLoader(怎么创建一个Loader)、onLoadFinished(当某个Loader加载完毕)、onLoaderReset(当某个Loader重置时)。

CursorLoader
负责异步查询ContentResolver并提供Cursor。它是Loader的子类AsyncTaskLoader的子类。也可以自定义一个Loader的子类来替代它。

它们和ListView、SimpleCursorAdapter是很好的搭档,以下为示例:

package com.company.app;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.app.LoaderManager;
import android.content.Loader;
import android.database.Cursor;
import android.content.CursorLoader;

public class ExampleActivity extends Activity 
    implements LoaderManager.LoaderCallbacks<Cursor> {

    private SimpleCursorAdapter mSimpleCursorAdapter = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.for_activity);
        ListView listView = (ListView) findViewById(R.id.of_list_view);
        // 实例化适配器。暂时先不设置Cursor
        mSimpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.for_list_view, 
        /* Cursor */ null, // 将由onCreateLoader()创建的Cursor替代
        /* String[] */ fromColumns, // 欲映射的列名集合
        /* int[] */ toViews, // 欲映射的控件ID(R.id.xxx)集合
        0);

        // 给ListView设置适配器。当适配器的Cursor更新后,
        // 将会根据上述映射关系把数据提供给ListView
        listView.setAdapter(mSimpleCursorAdapter);

        // 获取LoaderManager并初始化一个Loader。
        // 若initLoader()第一个参数所指定ID的Loader不存在,
        // 则会调用onCreateLoader()
        getLoaderManager().initLoader(/* id */ 0, null, this);

        // 给ListView设置点击事件监听器

        listView.setOnItemClickListener(mOnItemClickListener);

        // 过了一段时间之后,如果确定适配器所依赖的数据已更新,可以调用:
        mSimpleCursorAdapter.notifyDataSetChanged();
    }

    // LoaderCallbacks的三个方法之一:创建一个Loader。
    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        // 指定如何创建Cursor,以供mSimpleCursorAdapter使用。
        // 它会利用下述参数来调用ContentResolver.query()
        return new CursorLoader(this, 
            URI,            // Uri 类型,相当于表名
            PROJECTION,     // String[] 类型,欲查询的列名集合
            SELECTION,      // String   类型,WHERE语句
            SELECTION_ARGS, // String[] 类型,WHERE语句的参数
            SORT_ORDER);    // String   类型,排序语句
    }

    // LoaderCallbacks的三个方法之一:加载完某个Loader之后
    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        // 当异步加载完Cursor后,更新mSimpleCursorAdapter。
        // 接着后者会去通知ListView说有数据来了。
        // 旧的Cursor将在本方法返回后由系统自动关闭。
        mSimpleCursorAdapter.swapCursor(data);
    }

    // LoaderCallbacks的三个方法之一:当某个Loader重置时
    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        // 一旦mSimpleCursorAdapter绑定的Cursor被close()或者设为null,
        // ListView将无数据可显示
        mSimpleCursorAdapter.swapCursor(null);
    }

    // ListView的点击事件监听器
    private OnItemClickListener mOnItemClickListener = new OnItemClickListener() {
        public void onItemClick(AdapterView parent, View v, int position, long id) {
            // 处理点击事件
        }
    };
}

参考资料:
Android > API Guides > Activities > Loaders
https://developer.android.com/guide/components/fragments.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值