首页 > Android > 利用Cursor+CursorAdapter实现界面实时更新

利用Cursor+CursorAdapter实现界面实时更新

2011年7月17日 发表评论 阅读评论

这篇是转载,写得很不错,原文地址:http://www.cnblogs.com/halzhang/archive/2011/07/16/2108470.html,在此感谢原作者!

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

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

情景分析:

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

解决方案:

  • 使用通知,只能在通知栏看到更新,加入用户想在一个activity中有个进度显示呢?
  • 发送更新广播,当是在一个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)

anyShare分享到:
          
  1. zzli
    2011年10月24日17:26 | #1

    很久不见有更新,最近在忙什么呢?

    [回复]

    iStar CHINA Google Chrome Linux 回复:

    封闭开发中。。。
    多谢关注!

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.