您的位置:首页 > 其它

扣丁学堂——Loader

2016-01-13 19:31 204 查看
一丶代码见本文

二丶演示效果






三丶课程讲解
























































这里Person PersonMetadata PersonContentProvider DatabaseAdapter四个类是直接把上一节的拿来用,就不在赘述

MainActivity.xml就一个按钮一个ListView,ListView的item.xml也就三个TextView

DatabaseAdapter添加部分代码:

/**
 * 数据库操作
 */
public class DatabaseAdapter {
    private DatabaseHelper dbHelper;

    public DatabaseAdapter(Context context) {
        this.dbHelper = new DatabaseHelper(context);
    }

    /**
     * 返回 游标
     * @return
     */
    public Cursor list(){
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor c = db.query(true, PersonMetaData.Person.TABLE_NAME, null, null, null, null, null, null, null);

        return c;
    }
  }


MainActivity.java

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {

    private DatabaseAdapter dbAdapter;

    private SimpleCursorAdapter dataAdapter;

    private CursorLoader loader;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        dbAdapter = new DatabaseAdapter(this);

        ListView listView = (ListView) findViewById(R.id.listView);

        //在指定的布局中显示指定的数据,并变为内容观察者
        dataAdapter = new SimpleCursorAdapter(this, R.layout.list_item,
                dbAdapter.list(),//使用数据库返回的游标,相当于数据
                new String[]{PersonMetaData.Person._ID,
                        PersonMetaData.Person.NAME, PersonMetaData.Person.AGE},
                new int[]{R.id.textView_id, R.id.textView_name, R.id.textView_age},
                SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);//标记为内容观察者

        //在listview 中显示出数据
        listView.setAdapter(dataAdapter);

        //初始化 一个 loader 参数:编号,bundler传的参数,回调接口
        getLoaderManager().initLoader(0, null, this);
    }

    /**
     * 添加数据
     *
     * @param view
     */
    private void addClick(View view) {
        dbAdapter.save(new Person(19, "keke"));

        //重启加载器 强制加载
       // getLoaderManager().restartLoader(0, null, this);

        loader.onContentChanged();//内空发生了变化,通知加载器重新加载数据,会执行Loader的onLoadFinished方法,进行再次查询

    }

    /**
     * 开始查询
     *
     * @param id
     * @param args
     * @return
     */

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        Uri uri = Uri.parse("content://com.example.jin.contentp.personContentprovider/person");

        //创建游标加载器 参数:上下文,cp的uri,查询的列,查询条件,查询条件值,排序条件
        loader = new CursorLoader(this, uri, null, null, null, null);//进行查询
        return loader;
    }

    /**
     * 返回的数据 游标
     *
     * @param loader
     * @param data
     */
    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

        dataAdapter.swapCursor(data);//切换游标,将dataAdapter 里面的游标替换现在返回的游标
    }

    /**
     * 退出 释放资源
     *
     * @param loader
     */
    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        dataAdapter.swapCursor(null);
    }

}


方法二,使用自定义加载器

Main2Activity.java

public class Main2Activity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<ArrayList<Person>> {

    private ListView listView;

    private MyAdapter myAdapter;

    private DatabaseAdapter dbAdapter;

    private DataAsyncTaskLoader loader;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        listView = (ListView) findViewById(R.id.listView2);

        //实例化 数据库操作对象
        dbAdapter = new DatabaseAdapter(this);

        //查询数据
        ArrayList<Person> list = dbAdapter.findAll();

        //实例化 自定义适配器
        myAdapter = new MyAdapter(this, list);
        listView.setAdapter(myAdapter);

        getLoaderManager().initLoader(0, null, this);

    }

    /**
     * 异步加载 的 三个方法
     *
     * @param id
     * @param args
     * @return
     */
    @Override
    public Loader<ArrayList<Person>> onCreateLoader(int id, Bundle args) {
        loader = new DataAsyncTaskLoader(this, dbAdapter);
        return loader;
    }

    @Override
    public void onLoadFinished(Loader<ArrayList<Person>> loader, ArrayList<Person> data) {
        myAdapter.setPersons(data);
        myAdapter.notifyDataSetChanged();//通知发生变化

    }

    @Override
    public void onLoaderReset(Loader<ArrayList<Person>> loader) {
        loader = null;
    }

    /**
     * 自定义的数据加载器 loader
     */
    private static class DataAsyncTaskLoader extends AsyncTaskLoader<ArrayList<Person>> {//这里的泛型为最后要得到的数据类型

        //数据库操作对象
        private DatabaseAdapter dbAdapter;

        //保存返回的结果数据
        private ArrayList<Person> data;

        public DataAsyncTaskLoader(Context context, DatabaseAdapter dbAdapter) {
            super(context);
            this.dbAdapter = dbAdapter;
        }

        /**
         * 后台线程中执行的方法,用于加载数据
         *
         * @return
         */
        @Override
        public ArrayList<Person> loadInBackground() {
            data = dbAdapter.findAll();
            return data;
        }

        /**
         * 用于 发送结果
         *
         * @param data
         */
        @Override
        public void deliverResult(ArrayList<Person> data) {

            /**
             * 如果没有数据,则不发送
             */
            if (isReset()) {
                return;
            }

            /**
             * 如果是正在启动,则发送数据
             */
            if (isStarted()) { //调用onStartLoading方法
                super.deliverResult(data);//转发数据
            }
        }

        /**
         * 正在加载的时侯
         */
        @Override
        protected void onStartLoading() {
            /**
             * 如果数据不为空,则发送数据
             */
            if (data != null) {
                deliverResult(data);
            }

            /**
             * 如果数据内容发生了变化,
             */
            if (takeContentChanged()) {
                forceLoad();//强制加载数据 调用loadInBackground方法
            }

            super.onStartLoading();
        }
    }

    /**
     * 自定义 适配器 listView中显示的内容
     */
    private static class MyAdapter extends BaseAdapter {
        private ArrayList<Person> persons;
        private Context context;

        public void setPersons(ArrayList<Person> persons) {
            this.persons = persons;
        }

        public MyAdapter(Context context, ArrayList<Person> persons) {
            this.context = context;
            this.persons = persons;
        }

        @Override
        public int getCount() {
            return persons.size();
        }

        @Override
        public Object getItem(int position) {
            return persons.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHoler viewHoler;

            if (convertView == null) {
                LayoutInflater.from(context).inflate(R.layout.list_item, null);
                viewHoler = new ViewHoler();

                viewHoler.tv_id = (TextView) convertView.findViewById(R.id.textView_id);
                viewHoler.tv_name = (TextView) convertView.findViewById(R.id.textView_name);
                viewHoler.tv_age = (TextView) convertView.findViewById(R.id.textView_age);

                convertView.setTag(viewHoler);
            } else {
                viewHoler = (ViewHoler) convertView.getTag();
            }

            Person p = persons.get(position);
            viewHoler.tv_id.setText(String.valueOf(p.getId()));
            viewHoler.tv_name.setText(p.getName().toString());
            viewHoler.tv_age.setText(String.valueOf(p.getAge()));

            return convertView;
        }

        private static class ViewHoler {
            private TextView tv_id;
            private TextView tv_name;
            private TextView tv_age;

        }
    }

    /**
     * 当添加按钮时,添加内容,并且自动重新加载数据 重新调用 loadInBackground方法
     *
     * @param view
     */
    public void addClick(View view) {
        dbAdapter.save(new Person(112, "vivi"));
        loader.onContentChanged();//通知,内容发生了变化

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: