首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

Android开发——利用Cursor+CursorAdapter兑现界面实时更新(转)

2012-06-28 
Android开发——利用Cursor+CursorAdapter实现界面实时更新(转)好久没有更新博客了。不是没时间写,而是太懒。

Android开发——利用Cursor+CursorAdapter实现界面实时更新(转)

好久没有更新博客了。不是没时间写,而是太懒。而且感觉有些东西没有时间总结,之之后再想写,就想不起来了。晚上新发现一点东西,所以就及时写下来。

最近利用业余时间在看Android的Download模块,看得是2.3之前版本的源码,2.3之后android就开放了一个下载管理器,并提供了一些api。不过想对下载模块有更深入的了解还是必须自己花点时间看看downloadprovider的源码。相信会收获很多。如果有时间想写写文章对downloadprovider进行分析。

这篇文章不是分析download的,不过却是我从读download的源码发现的。

情景分析:

我们有一个Service,这个Service在后台会不断的更新多条数据,我们又想将不断更新的数据展现在ui上面这时你是怎么解决的呢?其实就是类似有些浏览器的下载管理器界面,有没有想过是怎么实现的??

解决方案:

1,使用通知,只能在通知栏看到更新,加入用户想在一个activity中有个进度显示呢?

2,发送更新广播,当是在一个listView中的多个列需要更新广播就有点吃力了;

还有吗?

参考方案:

利用Provider将数据持久化,再用Cursor监听Provider的变化来更新数据。当然这需要中Service update数据。

-----部分代码-------

//一个观察者

private?class?MyContentObserver?extends?ContentObserver {

?

public?MyContentObserver() {

super(new?Handler());

}

?

@Override

public?void?onChange(boolean?selfChange) {

super.onChange(selfChange);

Log.i("DLA",?"MyContentObserver onChange!");

//处理数据更新回调

refreshData();

}

?

}

?

private?void?refreshData() {

if?(mCursor.isClosed()) {

return;

}

//更新

mCursor.requery();

}

?

//一个实现CursorAdapter的适配器

private?MyAdapter?mAdapter;

?

private?Cursor?mCursor;

?

private?MyContentObserver?mObserver;

?

@Override

protected?void?onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.list);

setupViews();

mCursor?= getContentResolver().query(MyProvider.CONTENT_URI,?sAppReadableColumnsArray,

null,?null,?null);

mObserver?=?new?MyContentObserver();

//注册观察者

mCursor.registerContentObserver(mObserver);

mAdapter?=?new?MyAdapter(this, R.layout.list_item,?mCursor);

setListAdapter(mAdapter);

}

?

@Override

protected?void?onDestroy() {

super.onDestroy();

if?(mCursor?!=?null) {

mCursor.unregisterContentObserver(mObserver);

mCursor.close();

}

}

??

??

这样实现后当MyProvider.CONTENT_URI对应的数据发生变化时都会调用观察者的onChange方法,mCursor.requery()执行后listview就直接更新了。(不知道在其他类型的Adapter中是否自动更新,而不需要调用adapter的notifyDataSetChanged)

--------end--------

?

感谢:http://www.cnblogs.com/halzhang/archive/2011/07/16/2108470.html

热点排行