本博文为个人笔记所用,如果有新的想法,我还会随时更新。同时也欢迎大家斧正。
@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使用