2012-02-13 36 views
9

Vấn đề của tôi: ListView của tôi đặt lại vị trí cuộn của nó lên đầu bất cứ khi nào tôi cập nhật nội dung của nó thông qua SimpleCursorAdapter (tùy chỉnh) của nó. Tôi muốn ListView duy trì vị trí cuộn của nó khi được cập nhật.Cập nhật SimpleCursorAdapter trong khi duy trì vị trí cuộn trong ListView

Tôi bắt đầu bằng cách tạo phiên bản bộ điều hợp mới mỗi lần và sử dụng ListView.setAdapter(), nhưng theo this discussion Tôi nên cập nhật bộ điều hợp thay vì đặt lại bộ điều hợp. Tôi không thể tìm thấy một cách để làm điều này cho SimpleCursorAdapter hoạt động chính xác. Dưới đây là một số điều tôi đã thử, bỏ qua các đối số phương thức:
- SimpleCursorAdapter.changeCursorAndColumns() với con trỏ mới cập nhật thành công bộ điều hợp nhưng vẫn đặt lại vị trí cuộn.
- SimpleCursorAdapter.changeCursor() hoạt động theo cùng một cách.
- SimpleCursorAdapter.swapCursor() không khả dụng cho đến ngày 11 và tôi đang phát triển cho api 8.
- SimpleCursorAdapter.notifyDataSetChanged() không cập nhật ListView. (Có thể có một bước khác mà tôi đang thiếu.)
- ListView.invalidate() không cập nhật ListView.
- SimpleCursorAdapter.requery() làm cho Chế độ xem danh sách trống và không được dùng nữa.
- Tôi quen thuộc với giải pháp ListView.setSelection(), nhưng tôi không muốn ListView của mình chuyển động khi được cập nhật. Điều này đưa nó vào một vị trí trong danh sách.

Điều này có vẻ như nó phải là một vấn đề phổ biến và đơn giản. Có ai xử lý nó không?

+0

Xem bình luận của tôi dưới đây là câu trả lời. SimpleCursorAdapter.changeCursor() hoạt động chính xác - Tôi vừa có một dòng mã khác để sửa đổi mọi thứ. – pvans

Trả lời

5

Tôi đã gặp sự cố tương tự: My CursorAdapter đặt lại vị trí cuộn bất cứ khi nào nội dung của con trỏ thay đổi.

Tôi không nhận ra rằng tôi thực sự đã đặt bộ điều hợp danh sách mới mỗi khi dữ liệu thay đổi. Tôi nghĩ rằng con trỏ mình sẽ thông báo cho bộ chuyển đổi về những thay đổi đối với nội dung của nó nhưng trong trường hợp của tôi nó là ContentProvider kích hoạt LoaderManager.LoaderCallbacks.onLoadFinished() trong ListFragment của tôi. Trong callback đó, bây giờ tôi sử dụng CursorAdapter.changeCursor() thay vì tạo một adapter mới và mọi thứ hoạt động tốt.

Tôi hy vọng điều này sẽ giúp giải quyết vấn đề của bạn.

+0

Nó chỉ ra rằng SimpleCursorAdapter.changeCursor() hoạt động chính xác. Thủ phạm trong trường hợp của tôi gây ra vị trí cuộn listview để thiết lập lại là một cặp dòng mã được gọi ngay trước khi thay đổi con trỏ: 'ListView.SetDivider()' và 'ListView.SetDividerHeight'. Thực sự gây phiền nhiễu. Tôi cũng có một 'ListView.setCacheColorHint()' dòng trong đó, mà không _not_ gây ra các vị trí di chuyển để thiết lập lại. – pvans

0

đã như nhau trong bài thi của Async công tác sử dụng đoạn mã sau làm việc cho tôi

Cursor cursor = mDataHelper.getWritableDatabase().query(
         DataContract.Incares.TABLE_NAME, // Table to Query 
         null, // all columns 
         null, // Columns for the "where" clause 
         null, // Values for the "where" clause 
         null, // columns to group by 
         null, // columns to filter by row groups 
         DataContract.Incares.UUID +" DESC" // sort order 
       ); 
CursorAdapter.swapCursor(cursor); 
CursorAdapter.notifyDataSetChanged(); 

với CursorAdapter là một biến toàn cầu

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