扣丁学堂——Loader
2016-01-13 19:31
204 查看
一丶代码见本文
二丶演示效果
三丶课程讲解
这里Person PersonMetadata PersonContentProvider DatabaseAdapter四个类是直接把上一节的拿来用,就不在赘述
MainActivity.xml就一个按钮一个ListView,ListView的item.xml也就三个TextView
DatabaseAdapter添加部分代码:
MainActivity.java
方法二,使用自定义加载器
Main2Activity.java
二丶演示效果
三丶课程讲解
这里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();//通知,内容发生了变化 } }
相关文章推荐
- DbVisualizer报错You have an error in your SQL syntax; check the manual that corresponds to your MySQL
- hadoop2.6.0版本集群环境搭建
- android异步加载图片并缓存到本地实现方法
- iOS --NSPredicate
- LightOJ1033 Generating Palindromes(区间DP/LCS)
- AjaxAnywhere+struts用法
- Java 数组
- Lua 类型和值
- 网页手机宽度
- HDOJ 2091 空心三角形
- click through rate prediction
- New Relic for Java
- Micheal Nielsen's神经网络学习之二
- Disk Space Usage : unallocated, unused and reserved
- myeclipse使用常见问题
- 【Python】Python中中文的字符串格式化对齐
- 程序包javax.servlet.annotation不存在
- JAVA中三种URL连接方法
- BZOJ 1600: [Usaco2008 Oct]建造栅栏|动态规划
- Android 关于SVG矢量图支持