android---(Loader异步加载)

来源:互联网 发布:sqlserver设置默认值 编辑:程序博客网 时间:2024/05/16 12:25

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

//使用 CursorLoader

//程序清单文件中定义    <!-- 注册内容提供者 -->        <provider            android:name=".PersonContentProvider"            android:authorities="com.example.zhangjianbin.contentp.personContentprovider" />//定义布局 list_item.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"              android:layout_width="match_parent"              android:layout_height="match_parent"              android:layout_margin="@dimen/activity_vertical_margin"              android:orientation="vertical"    >    <TextView        android:id="@+id/textView_id"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="New Text"/>    <TextView        android:id="@+id/textView_name"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="New Text"/>    <TextView        android:id="@+id/textView_age"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="New Text"/></LinearLayout>//activity.xml<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"                xmlns:tools="http://schemas.android.com/tools"                android:layout_width="match_parent"                android:layout_height="match_parent"                android:paddingBottom="@dimen/activity_vertical_margin"                android:paddingLeft="@dimen/activity_horizontal_margin"                android:paddingRight="@dimen/activity_horizontal_margin"                android:paddingTop="@dimen/activity_vertical_margin"                tools:context=".MainActivity">    <Button        android:id="@+id/button"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignEnd="@+id/listView"        android:layout_alignParentStart="true"        android:layout_alignParentTop="true"        android:text="add"        android:onClick="addClick"        />    <ListView        android:id="@+id/listView"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentStart="true"        android:layout_below="@+id/button"/></RelativeLayout>
/** * 数据库操作 */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;    }  }
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.zhangjianbin.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);    }}

这里写图片描述

//使用自定义加载器,activity.xml,list_item于上面一样

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();//通知,内容发生了变化    }}
0 0