2011-11-21 38 views
5

Hey tôi sử dụng một listview cho các mục minh chứng được lưu trữ trong cơ sở dữ liệu. Tôi cũng có một phần tử EditText và một nút để thêm nội dung của EditText vào Cơ sở dữ liệu. Để ràng buộc nhằm nội dung cơ sở dữ liệu tôi sử dụng các SimpleCursorAdapter và sau chức năng populate:Android ListView cập nhật với SimpleCursorAdapter

private void populate() { 
    cursor = dbAdapter.getAllItems(); 
    startManagingCursor(cursor); 

    String[] from = new String[] { DBAdapter.KEY_TASK }; 
    int[] to = new int[] { android.R.id.text1 }; 

    // Now create an array adapter and set it to display using our row 
    cursorAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, from, to); 
    list.setAdapter(cursorAdapter); 
} 

Nếu tôi thêm một mục mới, bằng cách nhấp vào nút i muốn làm mới listview nhưng điều này chỉ hoạt động với chức năng populate và không có chức năng bộ điều hợp chung notifyDataSetChanged();. Tôi có một lỗi hoặc là cách này để làm mới một listview?

Trả lời

8

Bạn đã xem this, đã thử phương pháp swap cursor hoặc thử chỉ cần gọi lại setAdapter() một lần nữa?

Tôi đã gặp sự cố tương tự nơi tôi không thể tải danh sách của mình để cập nhật và những gì tôi đã làm chỉ là tạo phương thức refreshListView(). Bây giờ bạn có thể gọi điều này ban đầu từ onCreate() của bạn, VÀ bất cứ khi nào người dùng thêm điều gì đó vào DB. Tất cả những gì nó làm là gắn lại listview với một con trỏ. Với tất cả các phương thức không dùng nữa (requery()) và các vấn đề với notifyDataSetChanged(), tôi quyết định đây là cách dễ nhất.

+0

Chỉ cần đề cập: 'requery()' đã không còn được dùng nữa. [Tài liệu] (http://developer.android.com/reference/android/database/Cursor.html#requery()) có một bản ghi rõ ràng về điều này. – 87element

+0

Tôi biết, tôi đã không hoàn toàn từ câu đó đúng, nói lại nó:> – Jack

+0

Hey Jack cảm ơn bạn đã trả lời của bạn, tôi thấy rằng tôi quên nói mã trên là của tôi 'populate()' chức năng tôi gọi nó trong phương thức 'onCreate()' của tôi và nếu tôi nhấp vào nút "Add" -Button. Tôi chỉ muốn biết liệu đây có phải là một giải pháp tốt để gọi phương thức này thay vì gọi phương thức 'notifyDataSetChanged()' phổ biến của lớp bộ điều hợp cơ sở. –

2

Vui lòng tham khảo link này ... nó hoạt động như quyến rũ

Update SimpleCursorAdapter while maintaining scroll position in ListView

cho listview động trên cuộn i thêm mục mới từ cơ sở dữ liệu .. tôi đã sai lầm ở đây .. tôi đã gán bộ chuyển đổi mới cho mỗi lần cho cùng một simplecursoradapter. Thay vì tạo bộ điều hợp mới. chỉ cần sử dụng

adapter.changecursor(newcursorValue); 
adapter.notifydatasetChanged(); 
lsMedicine1.setSelectionFromTop(lsMedicine1.getLastVisiblePosition()-20, 0); 
1

Bạn cần phải gọi swapcursor() trước notifyDataSetChanged() trên adapter.

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