Android ListView实时更新

时间:2012-03-09 14:20:25

标签: android listview cursor

我在ListActivity中有一个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);

这很好用;列表显示光标中的数据。

但现在内容提供商有了新数据。我希望列表更新以显示新数据。

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

内容提供商是否需要知道哪些适配器附加到游标上,以便它可以调用它们的notifyDataSetChanged方法?或者是否有一种更好的方式,不会以这种方式看到这两种事物。

3 个答案:

答案 0 :(得分:6)

我在这里找到了答案:

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

简而言之,提供程序调用notifyChange来指示URI中的内容已更改:

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

ListActivity调用游标上的setNotificationUri来注册它有兴趣接收更改通知:

contentCursor.setNotificationUri(getContentResolver(), uri);

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

答案 1 :(得分:1)

假设ContentProvider属于您,您应该在cursor.setNotificationUri(getContext().getContentResolver(), uri); CP的实现中(在返回光标之前)和query getContext().getContentResolver().notifyChange(uri, null); update中添加insertdelete ... SimpleCursorAdapter这是DocumentListCursorAdapter的基础,应该注意刷新列表视图。

答案 2 :(得分:0)

您的意思是,您希望根据更改的数据更新列表 为此,试试这个:
当你得到新光标然后只需把这个代码设置为新的适配器列表..

adapter.notifyDatasetChanged();

listview.invalidate()