1.使用loader对象 首先创建一个LoaderMananager对象 ,调用LoaderManager对象的initLoader(agr1,agr2,agr3)
,第三个蚕食是LoaderCallBacks<object> 回调接口 所以 这个类实现这个LoaderCallBack<object>这个接口
2,listview绑定一个 SimpleCursorAdapter的 ,这个SimpleCursorAdapter的构造方法的游标初始设置为空
3,实现LoaderCallBacks<object>里面的方法 Loader<Cursor> onCreateLoader(int id, Bundle args)和onLoadFinished(Loader<Cursor> loader, Cursor data)
当然别忘了权限设置:
package com.example.cursorloader_contacts;
import android.annotation.SuppressLint;
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.support.v4.widget.CursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter;
import android.util.Log;
import android.view.Menu;
import android.widget.ListView;
import android.widget.TextView;
@SuppressLint("NewApi")
public class MainActivity extends Activity implements LoaderCallbacks<Cursor>{
/**
* 使用的是cursorloader 加载系统短信的数据
*/
private ListView lv;
private TextView tv;
private LoaderManager manager;
private SimpleCursorAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
tv = (TextView) findViewById(R.id.text_default);
//获取LoaderManager对象
manager = getLoaderManager();
/**
* 将loadermanager对象初始化
*
* 第一个参数:loader的对象的id
* 第二个参数:创建loader是否需要传递参数
* 第三个参数:LoaderCallBacks<Cursor>回调接口
*
* 如果指定id的loader存在则直接使用最后一个loader
* 如果指定id不存在则通过LoaderCallbacks<Cursor>回调接口中的onCreateLoader回调方法创建
*
*/
Bundle bundle=new Bundle();
bundle.putString("str", "传递到loader中的参数");
manager.initLoader(1, bundle, this);
/**
* 构造方法中标志位必须设置为
*
* FLAG_REGISTER_CONTENT_OBSERVER
*/
adapter = new SimpleCursorAdapter(MainActivity.this,
R.layout.item,
null, new String[]{"address","body"},
new int[]{R.id.tv_name,R.id.tv_content},CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
lv.setAdapter(adapter);
lv.setEmptyView(tv);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* 根据指定的id创建Loader对象
*
* 第一个参数:指定的id initLoader中指定的id
* 第二个参数:initLoader传递过来的bundle对象
*/
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// TODO Auto-generated method stub
Log.i("TAG", "----------onCreateLoader"+args.getString("str"));
CursorLoader loader = new CursorLoader(MainActivity.this,
Uri.parse("content://sms"),
null, null, null, null);
return loader;
}
/**
* 表示loader加载完毕时回调的方法 ,在这里进行更新数据
*
* 第一个参数:当前加载完毕的loader对象
* 第二个参数:data表示当前加载完毕后的数据对象
*/
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// TODO Auto-generated method stub
//将loader数据加载完毕之后更新数据库中的数据
adapter.swapCursor(data);
}
/**
* 当前的loader对象退出或者重置时回调的方法
*/
@Override
public void onLoaderReset(Loader<Cursor> loader) {
// TODO Auto-generated method stub
//清空数据
adapter.swapCursor(null);
}
}
权限:
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>