Listview Cuộn đến cuối danh sách sau khi cập nhật danh sách


292

Tôi muốn đảm bảo rằng danh sách được cuộn xuống tận cùng, sau khi tôi đã cập nhật listview bằng cách sử dụng listAd CHƯƠNG, để nó hiển thị phần tử cuối cùng được nhập vào danh sách. Tôi có thể làm cái này như thế nào ?

Tôi đã thử điều này nhưng không có may mắn:

lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

cảm ơn bạn


hãy thử làm điều này nó hoạt động ... messageListView.setTranscriptMode (ListView.TRANSCRIPT_MODE_NORMAL); messageListView.setStackFromBottom (đúng);
Superdev

lv.setTranscriptMode (ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL) chỉ đảm bảo rằng listView sẽ được cuộn xuống sau khi gọi adapter.notifyDataSetChanged. Nếu điều này không hoạt động, hãy thử xác định thuộc tính này trong xml như bạn có thể thấy trong các bài viết dưới đây.
TOMM

Câu trả lời:


418

Giả sử bạn biết khi dữ liệu danh sách thay đổi, bạn có thể thông báo thủ công danh sách để cuộn xuống dưới bằng cách đặt lựa chọn danh sách ở hàng cuối cùng. Cái gì đó như:

private void scrollMyListViewToBottom() {
    myListView.post(new Runnable() {
        @Override
        public void run() {
            // Select the last row so it will scroll into view...
            myListView.setSelection(myListAdapter.getCount() - 1);
        }
    });
}

@Bhupendra không cần thiết. Bạn cũng có thể làm mà không cần chủ đề, như thể hiện trong câu trả lời của Warting.
sagarpatidar

2
@Bhupendra setSelection () cập nhật giao diện người dùng. Bằng cách gọi bài đăng (Runnable) trên chế độ xem, bạn đảm bảo mã Runnable được chạy trên luồng giao diện người dùng Android. Nói chung làm theo cách này trừ khi bạn biết bạn đã sử dụng luồng UI hoặc đang đảm bảo rằng bằng một số phương tiện khác.
Mason Lee

5
Dường như việc sử dụng bài đăng trên bộ điều hợp mới được thiết lập sẽ gây ra hiệu ứng cuộn trong khi vẫn đảm bảo nằm trong luồng chính và sử dụng setSelection ngay sau khi cài đặt bộ điều hợp không gây ra hoạt hình cuộn
Gianluca P.

1
@SaifHamed như nhận xét của Mason Lee về câu trả lời của Kevin, điều này cũng khiến các danh sách ngắn có không gian "trống" ở đầu chế độ xem thay vì phía dưới rất có thể không phải là hành vi dự định.
dashhund 17/03/2015

16
bạn cũng có thể sử dụng myListView.smoothScrollToP vị trí (myListAd Module.getCount () - 1); để cuộn mượt mà
Zar E Ahmer

238

Bạn cần sử dụng các tham số này trong chế độ xem danh sách của mình:

  • Cuộn lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

  • Đặt phần đầu của danh sách xuống dưới cùng lv.setStackFromBottom(true);

Bạn cũng có thể đặt các tham số này trong XML, vd. như thế này:

<ListView
   ...
   android:transcriptMode="alwaysScroll"
   android:stackFromBottom="true" />

27
Lưu ý rằng với cách tiếp cận này, các hàng "xếp chồng từ dưới lên" của chế độ xem khi chúng được thêm vào. Điều này có nghĩa là các danh sách ngắn sẽ có không gian "trống" ở đầu chế độ xem thay vì phía dưới, đây không phải là điều luôn muốn.
Mason Lee

2
Câu hỏi nhanh: Bất kỳ cách nào tôi có thể có được cuộn để được hoạt hình? Nguyên nhân hiện tại khi tôi thông báoDataSetChanged () nó nhảy mà không có hình ảnh động?!?
Georg

@Georg Bạn đã tắt hình ảnh động trong Tùy chọn nhà phát triển trên thiết bị của mình chưa?
JonasCz - Phục hồi Monica

35

Một sự kết hợp của TRANSCRIPT_MODE_ALWAYS_SCROLL và setSelection đã khiến nó hoạt động với tôi

ChatAdapter adapter = new ChatAdapter(this);

ListView lv = (ListView) findViewById(R.id.chatList);
lv.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
lv.setAdapter(adapter);

adapter.registerDataSetObserver(new DataSetObserver() {
    @Override
    public void onChanged() {
        super.onChanged();
        lv.setSelection(adapter.getCount() - 1);    
    }
});

29

Tôi đã thành công khi sử dụng điều này để đáp lại một lần bấm nút, vì vậy tôi đoán rằng bạn cũng có thể sử dụng nó sau khi cập nhật nội dung của mình:

myListView.smoothScrollToPosition(theListAdapter.getCount() -1);

1
Đây là một giải pháp tuyệt vời. Đơn giản, một dòng.
Josh Larson

12

Để có được điều này trong ListFragment:

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); 
getListView().setStackFromBottom(true);`

Đã thêm câu trả lời này vì nếu ai đó thực hiện tìm kiếm google cho cùng một vấn đề với ListFragment, anh ta sẽ tìm thấy điều này ..

Trân trọng


9

Sử dụng: Đặt phần đầu của danh sách xuống dưới cùng lv.setStackFromBottom(true);

Làm việc cho tôi và danh sách được cuộn xuống phía dưới tự động khi nó lần đầu tiên được đưa vào tầm nhìn. Danh sách sau đó cuộn như nó nên với TRANSCRIPT_MODE_ALWAYS_SCROLL.


6
Lưu ý rằng với cách tiếp cận này, các hàng "xếp chồng từ dưới lên" của chế độ xem khi chúng được thêm vào. Điều này có nghĩa là danh sách ngắn sẽ có không gian "trống" ở đầu chế độ xem thay vì phía dưới.
Mason Lee

5

tôi sử dụng

setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);

để thêm các mục ở dưới cùng và các mục cũ hơn cuộn từ trên xuống, như bảng điểm trò chuyện


Gọi getListView().smoothScrollToPosition(getListAdapter.getCount() - 1);khởi động để cuộn xuống phía dưới trong phần bắt đầu của hoạt động.
palindrom

4

Giải pháp đơn giản nhất là:

    listView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
    listView.setStackFromBottom(true);

3

Chế độ bản ghi là những gì bạn muốn và được Google Talk và ứng dụng SMS / MMS sử dụng. Bạn có đang gọi chính xác notifyDatasetChanged () trên bộ điều hợp của bạn khi bạn thêm các mục không?


Vâng là tôi. danh sách được cập nhật chính xác, nhưng luôn luôn bắt đầu từ đầu. Tôi chỉ cần nó để thêm mục mới và luôn luôn di chuyển đến cuối danh sách.
jramirez

Chế độ sao chép thực sự bị vô hiệu hóa bởi ứng dụng SMS. Tôi không thể nhớ chính xác tại sao.
Timmmm
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.