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
- android---(Loader异步加载)
- Android异步加载数据---Loader
- Android Loader 异步加载数据
- Android异步加载数据--Loader
- Android—Loader异步加载
- Android-Universal-Image-Loader 异步加载图片
- Android异步加载器Loader的使用
- Android Loader机制,实现异步加载数据
- Android 异步加载神器Loader全解析
- Android Loader 异步加载详解二:探寻Loader内部机制
- Loader异步加载
- Loader异步加载ContentProvider
- Loader异步加载ContentProvider
- 异步加载机制-----Loader
- Android图片异步加载之Android-Universal-Image-Loader
- Android图片异步加载之Android-Universal-Image-Loader
- Android图片异步加载之Android-Universal-Image-Loader
- Android图片异步加载之Android-Universal-Image-Loader使用
- ural 1009 记忆化搜索
- MVC+jQuery.Ajax异步+增删改查和分页
- HDU - 5115 Dire Wolf(区间DP)
- Centos7中未知显示器设置屏幕分辨率
- logback日志配置
- android---(Loader异步加载)
- iOS开发之各种动画各种页面切面效果
- 接口实现
- 目标检测的图像特征提取之(二)LBP特征
- JDBC-结果集的特性(是否可滚动、是否敏感、是否可更新)
- GitHub上有很多不错的iOS开源项目
- Javascript实现的网签方法
- 怎么保存退出vi编辑
- hdu 4452 Running Rabbits