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 这个几个键盘事件来监测的话,监听不了右键的复制.剪贴和粘贴这些操作,处理 ... 
随机推荐
- 让 IE9 以下的浏览器支持 Media Queries
			1. 如何让 IE9 以下的浏览器支持 css3 的media query 需要用到的 min-width/max-width 属性 css3 的媒体查询 IE 浏览器的支持程度是从 IE9开始支持, ... 
- 基于vue-cli的eslint常用设置
			.editorconfig 文件详细备注 # 最顶级的配置,相当于根 editorconfig 直到查找到root=true 才会停止查找不然会一直向上查找 root = true # 通配符 表示匹 ... 
- jquery选择器最后一个,倒数第二个元素
			<div> <p>1</p> <p>2</p> <p>3</p> <p>4</p> < ... 
- C++学习2--坦克大战编写-前置知识
			基础班学习的这一个多月里的前三周讲解基础的语法,最后一周需要做坦克大战的项目巩固提高自己掌握的语法知识.这个系列博文主要是为了把学习过程中的知识点总结并记录下来: 开发语言与开发工具:C++,VS20 ... 
- Tomcat中catalina run后台运行脚本
			编写启动脚本start.sh,将其放在/srv/aubapp/bin/下 #!/bin/sh #设置web应用程序目录 export CATALINA_BASE="/srv/aubapp&q ... 
- ES系列十、ES常用查询API
			1.term查询 { "query": { "term": { "title": "crime" } } } 1.1.指 ... 
- win10 安装硕正
			提示权限不够,解决方法:根据提示路径手动在路径下建立文件夹 
- uboot 传递的参数 mtdparts
			启动uboot后,在重新烧写程序之前,查看传递给内核的参数时(命令为: printenv),看到如下内容: bootargs=console=ttyS0,115200 mtdparts=spi0.0: ... 
- 基于url拦截
- 最全的基于MFC的ActiveX控件开发教程
			浏览器插件之ActiveX开发(一) 一般的Web应用对于浏览器插件能不使用的建议尽量不使用,因为其涉及到安全问题以及影响用户安装(或自动下载注册安装)体验问题.在有特殊需求(如涉及数据安全的金融业务 ... 
