7

Đây là kịch bản: Tôi có một ListView đơn giản hiển thị nguồn cấp dữ liệu twitter. Tôi có một CursorAdapter đó là lấy tweets từ sqlite. Khi tôi gọi hàm requery() trên con trỏ của mình, tôi hy vọng rằng các mẩu tin mới sẽ được tìm nạp từ đó đã được thêm vào cơ sở dữ liệu. Điều này tất cả hoạt động tốt, và các mục mới thậm chí có thể nhìn thấy trong ListView sau khi điều này xảy ra.Android ListView với CursorAdapter có vị trí cuộn không chính xác sau khi Requery được gọi khi các mục mới được thêm

Vấn đề là vị trí cuộn dường như được lưu dựa trên độ lệch vị trí mục. Vì vậy, hãy nói vị trí hiển thị đầu tiên trong ListView của tôi là 4. Khi tôi requery và 2 mục mới được thêm vào đầu danh sách, ListView giữ vị trí cuộn mục đầu tiên có thể nhìn thấy là 4, tuy nhiên vì có hai mục mới trong danh sách , Bây giờ tôi thấy một mục khác ở vị trí 4 hơn trước khi tôi làm mới. Hình ảnh này minh họa trước và sau: enter image description here

Thông báo như thế nào Trước đây, Tweet D là mục có thể nhìn thấy đầu tiên và sau đó, Tweet B bây giờ trở thành mục có thể nhìn thấy đầu tiên.

Câu hỏi của tôi là, làm cách nào để giữ cùng một vị trí cuộn dựa trên positon của con trỏ khi gọi requery, sao cho trong ví dụ này, Tweet D vẫn sẽ là mục hiển thị đầu tiên sau khi yêu cầu?

Trả lời

0

Đề xuất của tôi là theo dõi số lượng mục trong danh sách. Một khi bạn biết rằng, như một phần của bản cập nhật, bạn có thể thêm sự khác biệt giữa số lượng cũ và số mới.

psuedo Mã

on_update

offset+= (list_view.length() - list_size) 
    list_size = list_view.length() 
3

Tôi đã có một vấn đề tương tự trong một trong những dự án của tôi. Đây là cách tôi giải quyết nó. Mặc dù nó không phải là chính xác cùng một trường hợp. Hy vọng nó giúp.

Trước khi bạn cập nhật danh sách, lưu vị trí cuộn theo cách này -

int position = getListView().getFirstVisiblePosition(); 
View v = getListView().getChildAt(0); 
int top = v == null ? 0 : v.getTop(); 

Và rồi sau khi bạn cập nhật danh sách, bạn sẽ biết có bao nhiêu mục mà bạn đã thêm. Vì vậy, bạn có thể gọi

yourlistview.setSelectionFromTop(position + <number of items added>, top); 
+0

Vấn đề chính của tôi với điều này là tất cả các mặt hàng của tôi không có cùng chiều cao, ví dụ: nếu một mục là một nửa hiển thị ... – Redth

+0

Bạn đã thử chưa? Bởi vì ngay cả danh sách của tôi cũng có các hàng có chiều cao thay đổi. Nhưng hoạt động hoàn hảo. 'int top = v == null? 0: v.getTop(); 'Phần này thực sự xử lý trường hợp khi một mục có thể nhìn thấy một nửa. – Enigma

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