- 1 Loader 转载器 Android3.0以后出来的 它可以使Activity和Fragment 异步加载数据 变得简单(Loader里封装了AsyncTask)
2 Loader特点:
- 对每一个Activity或者Fragment有效
- 提供异步加载数据的机制
- 监测数据源的变化 ,并对变化返回新的结果
- 由于配置发生改变 重新创建Loader时 他会自动链接上一个加载器游标,不会重新查询数据
3 使用:
1,初始化Loader initLoader(编号,查询条件,回调接口);
2,实现回调接口 实现三个方法
3,在三个方法里做相应的动作代码例子:
package com.qf.day18_loader_demo1; import android.app.Activity; import android.app.LoaderManager.LoaderCallbacks; import android.content.ContentResolver; 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.text.Editable; import android.text.TextWatcher; import android.widget.EditText; import android.widget.ListView; import android.widget.SimpleCursorAdapter; public class MainActivity extends Activity implements LoaderCallbacks<Cursor> { private EditText etContent; private ListView lv; // 查找数据 private ContentResolver contentResolver; private SimpleCursorAdapter adapter; private Uri contactsUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etContent = (EditText) findViewById(R.id.et_content); lv = (ListView) findViewById(R.id.lv); etContent.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub // 文本发生改变 Bundle bundle = new Bundle(); bundle.putString("key", s.toString()); // 当加载数据的条件发生改变时 重启loader getLoaderManager().restartLoader(1, bundle, MainActivity.this); } }); adapter = new SimpleCursorAdapter(MainActivity.this, R.layout.item, null, new String[] { "display_name", "data1" }, new int[] { R.id.tv_name, R.id.tv_data }, SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); lv.setAdapter(adapter); /** * 获取当前组件Activity 的Loader对象 获取Loader管理者对象 用对象进行初始化 * */ getLoaderManager().initLoader(1, null, this); } /** * 创建Loader 用于加载数据 * * @param id * @param args * @return */ @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { // TODO Auto-generated method stub String selection = null; String[] selectionArgs = null; // 有传递过来的数据 if (args != null) { String key = args.getString("key"); selection = "display_name like ? or data1 like ?"; selectionArgs = new String[] { "%" + key + "%", "%" + key + "%" }; } CursorLoader cursorLoader = new CursorLoader(MainActivity.this, contactsUri, new String[] { "_id", "display_name", "data1" }, selection, selectionArgs, null); return cursorLoader; } /** * Loader加载数据完成 调用此方法 * * @param arg0 * @param arg1 */ @Override public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) { // TODO Auto-generated method stub // 将数据展示到ListView上 adapter.swapCursor(arg1); } /** * 重置时 调用此方法 * * @param arg0 */ @Override public void onLoaderReset(Loader<Cursor> arg0) { // TODO Auto-generated method stub // 清除旧的数据 adapter.swapCursor(null); } }