2009-12-05 33 views
8

Tôi có một ListView trong đó sử dụng một CursorAdatper như bộ điều hợp của nó. Tôi muốn có xem danh sách đểLàm thế nào để làm mới một ListView để requery con trỏ của nó để repopulate dữ liệu của nó và quan điểm của nó

  • requery dữ liệu của nó
  • làm mới quan điểm của mình một khi requery được thực hiện.

tôi đã cố gắng:

CursorAdapter adapter = (CursorAdapter)listView.getAdapter(); 
adapter.notifyDataSetChanged(); 

Và tôi đã cố gắng:

CursorAdapter adapter = (CursorAdapter)listView.getAdapter(); 
adapter.getCursor().requery(); 

nhưng không ai làm việc. Tôi đã đặt một điểm ngắt trong phương thức truy vấn của ContentProvider, nhưng tôi không thấy yêu cầu được gọi hoặc ListView của tôi được làm mới với dữ liệu mới.

Bạn có thể cho tôi biết giải pháp cho vấn đề của tôi không?

Cảm ơn bạn.

Trả lời

16

Gọi requery() trên cơ sở dữ liệu hoặc nhà cung cấp nội dung Cursor được đính kèm với ListView qua số CursorAdapter tự động làm mới danh sách (kịch bản thứ hai của bạn ở trên). Bạn có thể xem someexamples của điều này. Nếu điều đó không hiệu quả với bạn, có thể có một số lỗi trong số ContentProvider hoặc bộ điều hợp của bạn.

+0

Cảm ơn sự giúp đỡ của bạn. – hap497

+0

nó hoạt động nhưng hiệu suất như thế nào? requery là dễ sử dụng nhưng tôi không biết nếu nó là tốt. – Emerald214

+9

requery hiện được đánh dấu là không được chấp nhận và thậm chí còn có một lưu ý nhỏ đi kèm với nó trong sdk. cách tốt nhất để làm điều này ngay bây giờ, nó là mát mẻ để vẫn còn sử dụng requery? – marchinram

5

bạn có thể thử: adapter.changeCursor (con trỏ mới). Nó làm việc cho tôi

+0

cũng làm việc cho tôi. một lưu ý cho các lập trình viên ở đây. changCursor() này cần được gọi trong luồng UI. Tôi gặp sự cố khi cuộc gọi đến từ chủ đề nền –

11

Trong API mới (sử dụng quản lý bộ nạp), bạn có thể sử dụng:

getLoaderManager().getLoader(_YOUR_LOADER_ID_).forceLoad(); 
+4

Một tùy chọn cũng là getLoaderManager(). RestartLoader(); – Anderson

+1

@Anderson với 'restartLoader', bạn cần cung cấp lại args và callbacks,' getLoader' chỉ dựa trên ID. – TWiStErRob

4

Tôi biết câu trả lời này có lẽ là quá muộn nhưng FYI cho người khác, nếu bạn đang sử dụng một bộ nạp con trỏ (như bạn có thể nên làm thay thế), chỉ cần làm

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

trong đó uri là cùng một uri được sử dụng cho trình tải con trỏ.

Các vấn đề liên quan