CursorLoader继承与AsycTaskLoader,内部自带ContentObserver。我们可以用它来读取数据库,并自动检测数据源的更新。
下面是读取短信的例子
public class LoadersActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks{ private ListView mListView; private MyAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_loaders); mListView = (ListView) findViewById(R.id.lv); LoaderManager loaderManager = getSupportLoaderManager(); loaderManager.initLoader(0, null, this); } @Override public Loader onCreateLoader(int id, Bundle args) { Uri CONTACT_URI = Uri.parse("content://sms/"); CursorLoader cursorLoader = new CursorLoader(this, CONTACT_URI, null, null, null, null); return cursorLoader; } @Override public void onLoadFinished(Loader loader, Cursor data) { data.moveToFirst(); mAdapter = new MyAdapter(this, data); mListView.setAdapter(mAdapter); } @Override public void onLoaderReset(Loader loader) { }}class MyAdapter extends BaseAdapter { private List mDataList; private Context context; private Cursor cursor; private class ViewHolder { TextView textView; } public MyAdapter(Context context, Cursor cursor) { this.context = context; this.cursor = cursor; } public void setDataList(List dataList) { this.mDataList = dataList; } @Override public int getCount() { return cursor.getCount(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; View view = convertView; if (view == null) { view = LayoutInflater.from(context).inflate(R.layout.item_cursor_loader, null); viewHolder = new ViewHolder(); viewHolder.textView = (TextView) view.findViewById(R.id.textview); view.setTag(viewHolder); } else { viewHolder = (ViewHolder) view.getTag(); } cursor.moveToPosition(position); viewHolder.textView.setText(cursor.getString(2)); return view; }}