Loader监听数据源的变化
步骤:
1.新建一个继承SQLiteOpenHelper的帮助类
2.在MainActivity中定义LoaderManager和SimpleCursorAdapter
3.按顺序重写如下方法:initLoader来启动
onCreateLoader->onStartLoading(forceLoad启动时强制加载)->loadInBackground->onLoadFinished(adapter.swapCursor(data))->onLoaderReset(adapter.swapCursor(null))
*manager.restartLoader()数据改变时立刻加载
public class DBHelper extends SQLiteOpenHelper {
public static final String USERTABLE = "usertable";
private static final String DBNAME = "QF.DB";
private static final int CURRENTVERSION = 1;
public DBHelper(Context context) {
super(context, DBNAME, null, CURRENTVERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + USERTABLE + "(_id INTEGER PRIMARY KEY AUTOINCREMENT" +
",USERNAME,NICKNAME);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
/**
* Loader:自动监听数据源是否发生变化
*/
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> { private static SQLiteDatabase db;
private DBHelper dbHelper;
private SimpleCursorAdapter adapter;
private LoaderManager manager; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new DBHelper(this);
db = dbHelper.getReadableDatabase();
ListView listView = (ListView) findViewById(R.id.lv);
// 1.获得一个Loader管理器
manager = getSupportLoaderManager();
//2.初始化Loader
//1.Loader的唯一标识符
//2.初始化Loader时传递的参数
//3.Loader的回调
manager.initLoader(1, null, this);
//最后一个参数表示当数据源发生改变时,Cursor能够立马感知到数据源发生变化
adapter = new SimpleCursorAdapter(this,
R.layout.listview_item, null, new String[]{"USERNAME"}, new int[]{R.id.username},
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
listView.setAdapter(adapter);
} //当Loader创建时回调
//1.Loader的id
//2.初始化Loader的参数
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Log.d("lenve", "onCreateLoader: " + Thread.currentThread());
return new MyLoader(this);
} //当异步加载完成时调用该方法
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
Log.d("lenve", "onLoadFinished: " + Thread.currentThread());
//交换Cursor
adapter.swapCursor(data);
} //当由于Loader重置导致Cursor失效时,调用该方法
@Override
public void onLoaderReset(Loader<Cursor> loader) {
Log.d("lenve", "onLoaderReset: " + Thread.currentThread());
adapter.swapCursor(null);
} public void addData(View view) {
ContentValues values = new ContentValues();
values.put("USERNAME", "李四i");
db.insert(DBHelper.USERTABLE, null, values);
//重启Loader
manager.restartLoader(1, null, this);
} static class MyLoader extends AsyncTaskLoader<Cursor> { public MyLoader(Context context) {
super(context);
} //在后台线程执行
@Override
public Cursor loadInBackground() {
Log.d("lenve", "loadInBackground: " + Thread.currentThread());
Cursor cursor = db.rawQuery("SELECT * FROM " + DBHelper.USERTABLE, null);
//在这里放回一个Cursor,该Cursor最终被onLoadFinished()方法接收到
return cursor;
} //开始加载时调用
@Override
protected void onStartLoading() {
super.onStartLoading();
Log.d("lenve", "onStartLoading: " + Thread.currentThread());
//第一次需要强制加载
forceLoad();
}
}
}
其中,适配器可以定义一个继承CursorAdapter的类,和baseAdapter的道理类似;且cursorAdapter的两个方法newView和bindView相当于BaseAdapter的getView方法的拆分
/**
* newView和bindView相当于BaseAdapter中的getView()方法
*/
public class MyAdapter extends CursorAdapter {
private LayoutInflater inflater; public MyAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
inflater = LayoutInflater.from(context);
} //初始化View
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = inflater.inflate(R.layout.listview_item, null);
ViewHolder holder = new ViewHolder();
holder.username = (TextView) view.findViewById(R.id.username);
view.setTag(holder);
return view;
} //给View上的控件绑定事件
//cursor.getColumnIndex("USERNAME")获取USERNAME字段的下标
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder) view.getTag();
holder.username.setText(cursor.getString(cursor.getColumnIndex("USERNAME")));
} class ViewHolder {
TextView username;
}
}
Loader监听数据源的变化的更多相关文章
- 详解vuex结合localstorage动态监听storage的变化
这篇文章主要介绍了详解vuex结合localstorage动态监听storage的变化,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 需求:不同组件间共用同一数据,当一个 ...
- HTML5 oninput实时监听输入框值变化的完美方案
在网页开发中经常会碰到需要动态监听输入框值变化的情况,如果使用 onkeydown.onkeypress.onkeyup 这个几个键盘事件来监测的话,监听不了右键的复制.剪贴和粘贴这些操作,处理组合快 ...
- 【转载】实时监听输入框值变化的完美方案:oninput & onpropertychange
oninput 是 HTML5 的标准事件,对于检测 textarea, input:text, input:password 和 input:search 这几个元素通过用户界面发生的内容变化非常有 ...
- 实时监听输入框值变化:oninput & onpropertychange
结合 HTML5 标准事件 oninput 和 IE 专属事件 onpropertychange 事件来监听输入框值变化. oninput 是 HTML5 的标准事件,对于检测 textarea, i ...
- js/jquery 实时监听输入框值变化的完美方案:oninput & onpropertychange
(1) 先说jquery, 使用 jQuery 库的话,只需要同时绑定 oninput 和 onpropertychange 两个事件就可以了,示例代码: $('#username').bin ...
- JS 获取和监听屏幕方向变化(portrait / landscape)
移动设备的屏幕有两个方向: landscape(横屏)和portrait(竖屏),在某些情况下需要获取设备的屏幕方向和监听屏幕方向的变化,因此可以使用Javascript提供的 MediaQueryL ...
- 实时监听输入框值变化的完美方案:oninput & onpropertychange
实时监听输入框值变化的完美方案:oninput & onpropertychange: 网址:http://www.cnblogs.com/lhb25/archive/2012/11/30/o ...
- 监听EditText的变化
http://liangruijun.blog.51cto.com/3061169/729505 之前博客上的有关EditText的文章,只是介绍EditText的一些最基本的用法,这次来深入学习一下 ...
- input 即时搜索 监听输入值的变化
在 Web 开发中经常会碰到需要动态监听输入框值变化的情况,如果使用 onkeydown.onkeypress.onkeyup 这个几个键盘事件来监测的话,监听不了右键的复制.剪贴和粘贴这些操作,处理 ...
随机推荐
- CTSC&APIO2018游记
Day-1 布吉岛干什么,好像只看了Splay Day0 再次布吉岛干什么,好像也只看了Splay 然后上了火车 wc没买方便面,只能吃40元的盒饭 半夜睡不着,那应该是我太菜了 Day1 九点下火车 ...
- luogu P3924 康娜的线段树
题面传送门 我们可以画图找规律 这里没图,要看图可以去看M_sea dalao的题解(逃 可以发现单个节点\(i\)对答案的贡献为该节点的点权\(*\frac{1}{2^{dep_i}}\)(\(de ...
- ppt 制作圆角三角形
制作圆角三角形: PART 01 :插入三角形与三个等大的圆形: PART 02 :利用[任意多边形]和[合并形状-剪除]获得缺三角: (先选中大三角形,然后再选中任意多边形,"格式&quo ...
- WPF版公司的自动签到程序
1.外包公司要求早上签到,就写了一个自动打卡程序. 2.一直都想写这个程序,可是一直没有思路,知道有个软件公司找我做自动答题程序,于是自动打卡程序才应运而生.未来可以将自动答题程序开源工大家查看. 3 ...
- Linux系统无线网卡的安装【转】
转自:http://www.linuxidc.com/Linux/2013-03/81473.htm 现在的很多的可移动无线网卡都是usb接口的,把这种网卡应用到windows操作系统上是很容易就能起 ...
- docker在centos7系统镜像下遇到的一些问题
一.成功安装服务后发现无法启动 报错为:Failed to get D-Bus connection: Operation not permitted 系统为centos7官方版镜像,源和依赖之类的都 ...
- shell script中read的用法
1.read基本读取 #!/bin/bash #testing the read command echo -n "Enter you name:" #echo -n 让用户直接在 ...
- 安装jdk的时候为什么会有两个jre文件
有些东西,你懂不懂其实并不太影响你干活,但有些人就是有疑惑就非得弄懂,不然浑身难受,我大概就是这种德性的.昨天安装javaSE的时候,看到jdk中有个jre文件夹,而根目录下又有个jre文件夹,非常困 ...
- Oracle 同步
原文出处:http://www.cnblogs.com/zeromyth/archive/2009/08/19/1549661.html Oracle备份功能包括: 高级复制(Advanced Rep ...
- centos6.5生产环境编译安装nginx-1.11.3并增加第三方模块ngx_cache_purge、nginx_upstream_check、ngx_devel_kit、lua-nginx
1.安装依赖包 yum install -y gcc gcc-c++ pcre-devel openssl-devel geoip-devel 2.下载需要的安装包 LuaJIT-2.0.4.zip ...