2012-03-09 11 views
8

Tôi có một ListView trong một ListActivity ràng buộc với một số dữ liệu. Tôi có một nhà cung cấp nội dung cung cấp dữ liệu.Android ListView Live Đang cập nhật

Các ListActivity được các dữ liệu bằng cách truy vấn một trình giải quyết nội dung:

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

Bây giờ hoạt động có con trỏ. Nó tạo ra một bộ chuyển đổi và gắn nó vào danh sách:

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

Điều này làm việc tốt; danh sách hiển thị dữ liệu trong con trỏ.

Nhưng giờ đây, nhà cung cấp nội dung có dữ liệu mới. Tôi muốn danh sách cập nhật để hiển thị dữ liệu mới.

Các ví dụ mà tôi đã thấy liên quan đến một cuộc gọi đến thông báo của bộ điều hợpDataSetChanged, nhưng dường như với tôi rằng điều này sẽ phá vỡ sự tách biệt giữa nhà cung cấp nội dung và danh sách đang tiêu thụ nội dung.

Nhà cung cấp nội dung có cần biết bộ điều hợp nào được gắn vào con trỏ để nó có thể gọi phương thức notifyDataSetChanged của họ không? Hoặc là có một cách tốt hơn mà không nhìn thấy hai điều này kết hợp theo cách này.

+0

Bạn đã xem http://developer.android.com/reference/android/content/ContentResolver.html#notifyChange%28android.net.Uri,%20android.database.ContentObserver,%20boolean%29? – Luksprog

+0

Tôi đã thử đăng ký với registerContentObserver, nhưng không thấy thay đổi nào xuất hiện khi con trỏ thay đổi. Điều đó có hiệu quả không? – stevex

+0

giống như slukian, cộng với bạn có thể cần 'contentCursor.setNotificationUri (cr, uri);' – njzk2

Trả lời

6

Tôi tìm thấy câu trả lời ở đây:

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

Tóm tắt l, nhà cung cấp gọi notifyChange để cho biết rằng nội dung tại URI đã thay đổi:

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

Và ListActivity gọi setNotificationUri trên con trỏ để đăng ký rằng đó là quan tâm đến việc nhận được thông báo về những thay đổi:

contentCursor.setNotificationUri(getContentResolver(), uri); 

(Cảm ơn njzk2 đã chỉ cho tôi đúng hướng).

+0

hehe vài giây trước tôi – Selvin

+1

Xin chào, tôi đang làm việc trên một vấn đề tương tự. Tôi có một BaseAdapter tùy chỉnh và tôi vượt qua một Con trỏ thu được từ Nhà cung cấp Nội dung tới Bộ điều hợp. Bây giờ dựa trên Q & A. của bạn Nếu tôi có thể yêu cầu, từ tài liệu 'setNotificationUri' ** Thông báo cho người nghe gắn liền với Resolver **. Làm thế nào để sử dụng để cập nhật Listview? Bạn không sử dụng ContentObserver? –

+0

URI chỉ là giá trị được tạo ra? Làm cách nào để biết URI của tôi không giống như một số URI của ứng dụng khác? –

0

Ý bạn là, bạn muốn cập nhật danh sách theo dữ liệu đã thay đổi.
Cho rằng chỉ cần cố gắng này:
khi bạn nhận được con trỏ mới sau đó chỉ cần đặt mã này thay vì thiết lập card mạng mới vào danh sách ..

adapter.notifyDatasetChanged(); 

listview.invalidate() 
+0

Làm cách nào để biết khi nào có con trỏ mới? Dữ liệu đã thay đổi (ví dụ: do một số hoạt động mạng - dữ liệu mới nhận được) và Nhà cung cấp nội dung nhận thức được rằng dữ liệu đã thay đổi. Nhà cung cấp nội dung làm gì để nhận thông báo đến ListActivity? Thật dễ dàng để giải quyết vấn đề này nếu bạn giả định nhà cung cấp và danh sách nằm trong cùng một ứng dụng, nhưng nếu nhà cung cấp nội dung được kết nối với danh sách trong một quy trình khác thì sao? Nhà cung cấp nội dung làm gì để truyền đạt sự thay đổi sang danh sách ở đâu? – stevex

+0

Chúng ta có cần phải thực hiện cả hai hoặc 'adapter.notifyDatasetChanged()' sẽ cập nhật Listview? –

1

asuming rằng ContentProvider là của bạn bạn nên thêm cursor.setNotificationUri(getContext().getContentResolver(), uri); trong việc thực hiện query bạn của CP (trước khi bạn quay trở lại con trỏ) và getContext().getContentResolver().notifyChange(uri, null); trong update, insert, delete ... SimpleCursorAdapter đó là prolly cơ sở của bạn DocumentListCursorAdapter nên chăm sóc về làm mới listview .