2012-03-09 79 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應該照顧的基地有關刷新列表視圖。