2012-03-09 118 views
8

我在ListActivity中有一个绑定到某些数据的ListView。我有一个提供数据的内容提供者。Android ListView实时更新

的ListActivity通过查询内容解析器得到数据:

Uri uri = Uri.parse("content://my.provider.DocumentProvider/mystuff"); 
contentCursor = this.getContentResolver().query(uri, null, null, null, null); 

所以,现在的活动有光标。它创建一个适配器,并将其附加到列表中:

ListAdapter adapter = new DocumentListCursorAdapter(this, R.layout.main_row_layout, contentCursor, new String[] { "titleColumn" }, new int[] { titleColumnIndex }); 
setListAdapter(adapter); 

This works fine;该列表显示光标中的数据。

但现在内容提供商有新的数据。我想要更新列表以显示新数据。

我见过的例子涉及调用适配器的notifyDataSetChanged,但在我看来,这打破了内容提供者和消耗内容的列表之间的分离。

内容提供者是否需要知道哪些适配器连接到了光标,以便它可以调用它们的notifyDataSetChanged方法?或者有没有更好的方式,没有看到这两种方式耦合这种方式。

+0

你看过http://developer.android.com/reference/android/content/ContentResolver.html#notifyChange%28android.net.Uri,%20android.database.ContentObserver,%20boolean%29? – Luksprog 2012-03-09 14:29:38

+0

我曾尝试使用registerContentObserver进行注册,但在光标更改时未看到更改。应该这样做吗? – stevex 2012-03-09 14:42:23

+0

与slukian相同,再加上你可能需要'contentCursor.setNotificationUri(cr,uri);' – njzk2 2012-03-09 14:44:41

回答

6

我找到了答案在这里:

http://mylifewithandroid.blogspot.com/2008/03/observing-content.html

在nutshel l时,提供程序调用有NotifyChange表明,在URI中的内容发生了变化:

getContext().getContentResolver().notifyChange(uri, null); 

而且ListActivity呼吁setNotificationUri上的光标来注册,它的兴趣接收更改通知:

contentCursor.setNotificationUri(getContentResolver(), uri); 

(感谢njzk2指出我在正确的方向)。

+0

hehe几秒前我 – Selvin 2012-03-09 15:36:26

+1

嗨,我正在研究类似的问题。我有一个自定义BaseAdapter,并将从Content Provider获得的光标传递给适配器。现在基于你的Q&A。如果我可能会问,从文档'setNotificationUri' **通知连接到解析器**的监听器。如何使用它来更新ListView?你没有使用ContentObserver吗? – 2012-05-20 19:38:58

+0

URI只是一个虚构的值吗?我如何知道我的URI不是与其他应用程序的URI相同? – 2013-05-03 05:31:54

0

你的意思是,你想根据数据改变来更新列表。
对于刚刚尝试这个办法:
当你得到新的光标则只是把这个代码,而不是设置新的适配器列出..

adapter.notifyDatasetChanged(); 

listview.invalidate() 
+0

我如何知道何时可以得到新的光标?数据已发生变化(例如,由于某些网络活动 - 收到新数据),并且内容提供者知道数据已更改。内容提供者如何通过ListActivity获取通知? 如果您假定提供者和列表在同一个应用中,那么解决这个问题就很容易,但是如果内容提供者连接到另一个进程中的列表呢?内容提供者做什么来将变化传递到列表所在的位置? – stevex 2012-03-09 15:06:16

+0

我们需要做这两个或'adapter.notifyDatasetChanged()'会更新列表视图? – 2012-05-20 19:46:50

1

asuming是ContentProvider的是你,你应该在你的query实现CP的加入cursor.setNotificationUri(getContext().getContentResolver(), uri);(之前你返回光标)和getContext().getContentResolver().notifyChange(uri, null);updateinsertdelete ... SimpleCursorAdapter这是prolly您DocumentListCursorAdapter应该照顾的基地有关刷新列表视图。