2011-08-04 35 views
20

Tôi đã có một Adapter tùy chỉnh cho một thiết lập ListView và hoạt động ok. Trên một nút bấm một cái gì đó được thay đổi trong dữ liệu cơ bản, do đó, một notifyDataSetChanged là cần thiết để làm mới ListView. Khỏe. Nhưng tôi cũng muốn ListView cuộn đến dòng nơi thay đổi xảy ra. Đối với điều này tôi gọi smoothScrollToPosition ngay lập tức sau khi notifyDataSetChanged. Và điều đó không hiệu quả.smoothScrollToPosition sau khi thông báoDataSetChanged không hoạt động trong android

Nếu tôi không gọi notificationDataSetChanged thì cuộn sẽ hoạt động, vì vậy thông báo sẽ chặn cuộn. Có lẽ tôi đang chiến đấu với các sự kiện đang được xử lý trong tương lai. Ai có thể cho tôi một con trỏ trên những gì đang xảy ra không?

+1

Một chút thông tin bổ sung; hành vi này xảy ra trên trình mô phỏng. Khi chạy trên điện thoại, tình huống được trộn lẫn; đôi khi cuộn hoạt động và đôi khi không. Nó có vẻ là một câu hỏi liệu thông báo được hoàn thành trước khi thực hiện trơn tru. Hoặc có thể theo thứ tự nào. – tbeernot

Trả lời

78

Sử dụng phương pháp post() chờ danh sách để hoàn tất cập nhật sau khi bạn gọi notifyDataSetChanged():

adapter.notifyDataSetChanged(); 
list.post(new Runnable() { 
    @Override 
    public void run() { 
    //call smooth scroll 
    } 
    }); 
+0

Cảm ơn bạn! Những công việc này. Trên giả lập danh sách nhảy đến cuối và sau đó đến nơi tôi đã nói với nó để đi đến, nhưng trên một chiếc điện thoại này không nhìn thấy được. – tbeernot

+0

Về lý thuyết, danh sách nên ở trong cùng một vị trí mà trước đó là 'notifyDatasetChanged()', vì vậy nếu bạn làm mới với các phần tử ít hơn, nó có hiệu quả sẽ đi đến đầu tiên. – dmon

+0

Thử nghiệm cho thấy rằng notificationDatasetChanged làm cho danh sách luôn nhảy xuống phía dưới, smoothScrollToPosition làm cho nó nhảy để mục nhập nằm ở trên cùng. Trên trình mô phỏng, điều này hiển thị rõ ràng, trên một điện thoại thực tế, danh sách là "bồn chồn" và có hành động khi không có yêu cầu. – tbeernot

0

Tôi đã thử mã ví dụ của dmon và tôi thấy nó không phải lúc nào cũng làm việc.

Trên thực tế tôi đã tìm thấy cách tiếp cận khác để thực hiện di chuyển:

adapter.notifyDataSetChanged(); 
channelsListView.setSelection(scrollPos); // it works without smoothScrollToPositionFromTop(..) or smoothScrollToPosition() methods call. 

Tôi thấy ý tưởng chính để sử dụng phương pháp nêu trên sau khi đọc câu trả lời này: https://stackoverflow.com/a/20997828/2133585

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