权限
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
1 获得LoaderManager对象
LoaderManager lm = getSupportLoaderManager();
2 通过LoaderManager初始化Loader
3 实现LoaderCallbacks 接口
4 在onCreateloader 方法中,创建CursorLoader
5 在 onLoadFinished方法中 获取加载数据 更新UI
小例子 通过LoaderManager 查询联系人
/*
* 1 获得loaderManager 对象
* 2 使用loaderManager 来初始化对象
* 3 实现loaderCallbacks 接口
* 4 在onCreateLoader 方法中返回CursoreLoade 在onLoadFinished 方法中获得加载的数据
*
*/
public class MainActivity extends AppCompatActivity implements LoaderManager
.LoaderCallbacks<Cursor> {
private static final String TAG = "MainActivity12";
private ListView listView;
private SimpleCursorAdapter mSimpleCursorAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LoaderManager lm = getSupportLoaderManager();
//初始化Loader ,参数1 Loader的Id 参数2 给loader 传递的参数 参数3 loader 的LoaderCallbacks 接口
lm.initLoader(0, null, this);
listView = findViewById(R.id.lv);
//设置游标适配器 注册一个内容的观察者
mSimpleCursorAdapter = new SimpleCursorAdapter(this, android.R.layout
.simple_list_item_1, null, new
String[]{ContactsContract.Contacts.DISPLAY_NAME},
new int[]{android.R.id.text1}, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
listView.setAdapter(mSimpleCursorAdapter);
}
//创建Loader对象
@NonNull
@Override
public Loader<Cursor> onCreateLoader(int i, @Nullable Bundle bundle) {
CursorLoader cursorLoader = new CursorLoader(this, ContactsContract.Contacts.CONTENT_URI,
null, null, null, null);
return cursorLoader;
}
//加载数据完成 主线程完成
@Override
public void onLoadFinished(@NonNull Loader loader, Cursor cursor) {
Log.d(TAG, "onLoadFinished: " + cursor.toString());
//可更新UI
mSimpleCursorAdapter.swapCursor(cursor);//切换游标
}
//重置Loader
@Override
public void onLoaderReset(@NonNull Loader loader) {
//释放游标
mSimpleCursorAdapter.swapCursor(null);
}
}
增加筛选功能
public class MainActivity extends AppCompatActivity implements LoaderManager
.LoaderCallbacks<Cursor> {
private static final String TAG = "MainActivity12";
private ListView listView;
private EditText editText;
private SimpleCursorAdapter mSimpleCursorAdapter;
private String filterName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final LoaderManager lm = getSupportLoaderManager();
//初始化Loader ,参数1 Loader的Id 参数2 给loader 传递的参数 参数3 loader 的LoaderCallbacks 接口
lm.initLoader(0, null, this);
listView = findViewById(R.id.lv);
//设置游标适配器 注册一个内容的观察者 添加一个联系人 或者删除一个联系人 会及时的更新 FLAG_REGISTER_CONTENT_OBSERVER
mSimpleCursorAdapter = new SimpleCursorAdapter(this, android.R.layout
.simple_list_item_1, null, new
String[]{ContactsContract.Contacts.DISPLAY_NAME},
new int[]{android.R.id.text1}, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
listView.setAdapter(mSimpleCursorAdapter);
editText = findViewById(R.id.contacts_name_et);
//联系人筛选文本框改变后, 重新加载Loader
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
filterName = s.toString();
//重新创建Loader
lm.restartLoader(0, null, MainActivity.this);
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
//创建Loader对象
@NonNull
@Override
public Loader<Cursor> onCreateLoader(int i, @Nullable Bundle bundle) {
Uri uri = ContactsContract.Contacts.CONTENT_URI; //添加筛选
if(!TextUtils.isEmpty(filterName)){
uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_FILTER_URI,
Uri.encode(filterName));
}
CursorLoader cursorLoader = new CursorLoader(this,
uri,
null,
null,
null,
null);
return cursorLoader;
}
//加载数据完成 主线程完成
@Override
public void onLoadFinished(@NonNull Loader loader, Cursor cursor) {
Log.d(TAG, "onLoadFinished: " + cursor.toString());
//可更新UI
// 切换游标
Cursor oldCursor = mSimpleCursorAdapter.swapCursor(cursor);
if (oldCursor != null) {
oldCursor.close();
}
}
//重置Loader
@Override
public void onLoaderReset(@NonNull Loader loader) {
//释放游标
Cursor oldCursor = mSimpleCursorAdapter.swapCursor(null);
if (oldCursor != null) {
oldCursor.close();
}
}
}