Cuộn Android ListView lên đầu


80

Tôi có một ListViewvới các hàng tùy chỉnh. Khi bất kỳ hàng nào trong số này được nhấp vào, dữ liệu của ListView sẽ được tạo lại. Tôi muốn danh sách cuộn trở lại đầu khi điều này xảy ra.

Ban đầu tôi đã thử sử dụng setSelection(0)trong từng hàng OnClickListener để đạt được điều này nhưng không thành công (Tôi tin rằng vì hàng ListView mất vị trí cuộn khi dữ liệu của nó bị vô hiệu - vì vậy lệnh gọi setSelection của tôi không được hoàn tác. Tôi vẫn không hiểu làm thế nào ListView quyết định vị trí cuộn đến sau khi hết hiệu lực, mặc dù).

Giải pháp hoạt động duy nhất mà tôi biết đã được Romain Guy đưa ra tại đây: http://groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301

Nó liên quan đến ( View.post) nhập cuộc gọi đến _listView.setSelection(0). Tôi thấy điều này thực hiện khá kém. Danh sách mới được tạo hiển thị với vị trí cuộn của nó không thay đổi và có một độ trễ đáng kể trước khi nó cuộn trở lại đầu trang.

Có cách nào tốt hơn để đạt được chức năng này không?

Bất kì sự trợ giúp nào đều được đánh giá cao.

Cảm ơn!

Câu trả lời:


132

gọi listView.setSelectionAfterHeaderView();để cuộn lên đầu trang


66
đó chính xác là những gì tôi đã gọi nó.
markhiz

102

Tôi đã cố gắng rất nhiều nhưng điều này làm việc cho tôi

list.smoothScrollToPosition(0);

3
Điều này thật tuyệt. Tôi tự hỏi nếu bạn có thể thay đổi tốc độ cuộn.
theblang

Cũng có thể có một cuộc gọi lại để biết khi nào trò chơi kết thúc để tôi có thể chuyển sang màn hình tiếp theo?
Amol Gupta

41

Tôi chỉ đơn giản sử dụng listview.setSelection(0);

Hoạt động tốt cho tôi.


5

Nếu bạn cần cuộn ngay sau khi ListViewdữ liệu của bộ điều hợp được thay đổi, hãy chú ý rằng nó có thể chưa được điền. Trong trường hợp này, bạn nên post()của bạn setSelection()hoặc setSelectionAfterHeaderView()thông qua Handlerđể nó sẽ được gọi sau này trong hàng đợi.

listView.Handler.post(new Runnable() {
            @Override
            public void run() {
                listView.setSelectionAfterHeaderView();    
            }
        });

Điều này đã làm việc cho tôi.


4

Cá nhân tôi khuyên bạn nên tìm một mẫu giao diện người dùng khác. Có thể người dùng sẽ thấy cách tiếp cận hiện tại của bạn "nhấp chuột và danh sách thay đổi tại chỗ " trực quan, nhưng tôi nghi ngờ.

Bạn có thể thử phân lớp con ListViewvà ghi đè layoutChildren()để xâu chuỗi vào lớp cha, sau đó gọi setSelection(0)trong trường hợp cần thiết. Nếu "sự chậm trễ đáng kể" chỉ là do post()cuộc gọi, điều này sẽ xóa nó.


4
Cảm ơn vì lời đề nghị, tôi sẽ sớm cung cấp cho bạn. Danh sách được thay đổi tại chỗ vì các đường dẫn được hiển thị ở nơi khác trên màn hình - các thiết kế giao diện người dùng android điển hình ít phù hợp hơn với các mục tiêu giao diện người dùng cụ thể của tôi và người dùng mục tiêu. Ngoài ra, cảm ơn TẤT CẢ sự giúp đỡ của bạn - Tôi đã đọc một số câu trả lời stackoverflow và tài liệu CommonsWare của bạn, và chúng đã giúp tôi đáng kể trong việc bắt đầu trên nền tảng này!
aakash

đây là cách để làm điều đó, không có phương pháp huyền diệu, chỉ là logic thuần túy. Cảm ơn!
Leo ủng hộ Monica Cellio

2

như một giải pháp thay thế, bạn có thể tạo bộ điều hợp mới chứa dữ liệu được tạo mới, sau đó gọi ListView.setAdapter. sau đó gọi ListView.setSelection (n).

btw, giải pháp do commonsware cung cấp đã hoạt động.


2

Theo một số yêu cầu khác nhau. Nếu bạn muốn cuộn lên giống như khi trò chuyện.

        mListView.smoothScrollToPosition(mAdapter.getCount());

1

Cái này hoạt động tốt khi bạn muốn tập trung văn bản chỉnh sửa từ tiêu đề listview

listview.setSelectionFromTop(0,0);

Nếu bạn muốn chọn chế độ xem chỉ mục cụ thể từ chế độ xem danh sách thì

listview.setSelection(index); // o for top
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.