CursorLoader的使用

本博文为个人笔记所用,如果有新的想法,我还会随时更新。同时也欢迎大家斧正。

@http://blog.csdn.net/tt_man


目标只有一个——CursorLoader的使用,注释都在代码里;

关键步骤:

getLoaderManager().initLoader(1, null, this);
CursorLoader cursorLoader = new CursorLoader(this, contactUri, 
null, null, null, null);

废话少说,看代码!


package com.danny_jaing.day20_cursorloader;

import android.app.Activity;
import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

/**
 * CursorLoader的使用步骤;
 * 1 将Activity实现LoaderCallback,并指定泛型(就是需要加载的数据格式)
 * 2 实现抽象方法
 * 	onCreateLoader--创建一个Loader传递给LoaderManager,执行异步耗时操作
 * 	onLoadFinished--接收异步耗时操作返回的数据,刷新UI
 * 	onLoaderReset
 * 3 获取LoaderManager,通过此LoaderManager初始化Loader
 *
 */
public class MainActivity extends Activity implements LoaderCallbacks<Cursor>{
	
	//声明访问联系人的URI
	private Uri contactUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
	private ListView listView;
	private SimpleCursorAdapter adapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		initViews();
		
		/**
		 * 使用LoaderManager加载数据,并刷新UI
		 */
		// 3.1 获取LoaderManager对象
		LoaderManager lm = getLoaderManager();
		
		// 3.2 通过LoaderManger初始化Loader
		/*
		 * 第一个参数:所需要创建的Loader的ID(如果之前此ID所对应的Loader已经被创建,则不会重新创建)
		 * 第二个参数:Bundle对象,向所需要创建的Loader传递参数
		 * 第三个参数:加载的回调接口
		 */
		lm.initLoader(1, null, this);
	}

	private void initViews() {
		listView = (ListView) findViewById(R.id.listMain);
		
		adapter = new SimpleCursorAdapter(this, 
				android.R.layout.simple_list_item_2, null, 
				new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
						ContactsContract.CommonDataKinds.Phone.DATA}, 
				new int[]{android.R.id.text1, android.R.id.text2},
				CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
		
		listView.setAdapter(adapter);
	}

	/**
	 * 创建Loader时被调用
	 * 在此方法中需要返回具体Loader实例
	 */
	@Override
	public Loader<Cursor> onCreateLoader(int id, Bundle args) {
		android.util.Log.e("danny", "onCreateLoader--id is " + id);
		//创建CursorLoader并返回,并指定此Loader加载的是哪一个数据库,以及过滤语句
		CursorLoader cursorLoader = new CursorLoader(this, contactUri, 
				null, null, null, null);
		return cursorLoader;
	}

	/**
	 * 当数据加载完毕时此方法被调用,
	 * 在此方法中需要根据返回的数据刷新UI界面
	 * @param data 就是异步任务所加载的数据
	 */
	@Override
	public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
		android.util.Log.e("danny", "onLoadFinished");
		
		while(data.moveToNext()) {
			String name = data.getString(data.getColumnIndex(
					ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
			String num = data.getString(data.getColumnIndex(
					ContactsContract.CommonDataKinds.Phone.DATA));
			
			android.util.Log.e("danny", "name is " + name + " num is " + num);
		}
		
		//将异步加载获取的Cursor对象重新添加到适配器中
		adapter.changeCursor(data);
	}

	/**
	 * 当Loader被重置时此方法被调用
	 * 一般在此方法中,需要将数据清除
	 */
	@Override
	public void onLoaderReset(Loader<Cursor> loader) {
		android.util.Log.e("danny", "onLoaderReset");
		adapter.changeCursor(null);
	}
}









CursorLoader当然是主要用于数据库了,返回的数据当然一般是Cursor格式了,所以经常搭配SimpleCursorAdapter使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值