17 ContentProvider

  • 1 Loader 转载器 Android3.0以后出来的 它可以使Activity和Fragment 异步加载数据 变得简单(Loader里封装了AsyncTask)
  • 2 Loader特点:

    1. 对每一个Activity或者Fragment有效
    2. 提供异步加载数据的机制
    3. 监测数据源的变化 ,并对变化返回新的结果
    4. 由于配置发生改变 重新创建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);
        }
    
    }
    

    这里写图片描述

原文地址:https://www.cnblogs.com/muyuge/p/6152239.html