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 这个几个键盘事件来监测的话,监听不了右键的复制.剪贴和粘贴这些操作,处理 ...
随机推荐
- Linux常用命令(一)查看日志
当日志文件存储很大时,需要Linux命令查看: Log 在目录 /var/log/ 下 常用命令: tail head grep sed cat tac https://blog.csdn.net ...
- 3D点云数据分析:pointNet++论文分析及阅读笔记
PointNet的缺点: PointNet不捕获由度量空间点引起的局部结构,限制了它识别细粒度图案和泛化到复杂场景的能力. 利用度量空间距离,我们的网络能够通过增加上下文尺度来学习局部特征. 点集通常 ...
- Android关于RAM、ROM、SD卡以及各种内存的区别
RAM:运行时内存.相当于PC机的内存存储,用于存储应用运行时的各种对象和变量常量等,主要作用在于提高运行速度.是唯一一种断电后数据会清除的存储器. 机身内存:相当于PC机硬盘.主要包括三块区域:RO ...
- 基于神经网络的颜色恒常性—Fully Convolutional Color Constancy with Confidence-weighted Pooling
论文地址: http://openaccess.thecvf.com/content_cvpr_2017/papers/Hu_FC4_Fully_Convolutional_CVPR_2017_pap ...
- PP图和QQ图
一. QQ图 分位数图示法(Quantile Quantile Plot,简称 Q-Q 图) 统计学里Q-Q图(Q代表分位数)是一个概率图,用图形的方式比较两个概率分布,把他们 ...
- Python3学习笔记25-logging模块
logging模块,Python自带用来记录日志的模块. 因为工作需要用到关于日志的,最近一直都在看关于日志模块的东西,百度了很多文章,可惜都是看的让人一头雾水,最后运气不错,找到一篇很详细的文章.传 ...
- Python3学习笔记15-迭代器与生成器
生成器 如果创建一个有很多元素的列表,但是只需要访问前几个元素,后面的元素占着的空间就白白浪费了 在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间. 在Pytho ...
- Salt Document学习笔记1
原文来自Salt Documentation,作者是 Thomas Hatch),我摘抄部分可能今后会用到或适合入门到精通的一些原文段落,简单翻译后发上来,便于查阅和研究 一.原理方面:The net ...
- saltstack自动化运维系列12配置管理安装redis-3.2.8
一.准备redis自动化配置的文件(即安装一遍redis,然后获取相关文件和配置在salt中执行上线) 1.源码安装redis3.2.8并注册为系统服务 安装依赖yum install -y tcl ...
- webpack中的output.filename 和output.chunkFilename
filename应该比较好理解,就是对应于entry里面生成出来的文件名.比如: { entry: { "index": "pages/index.jsx" } ...