android loader笔记 CursorLoader

权限


    <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();
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值