2010-07-22 21 views
9

Tôi biết về setSelection(), setSelectionFromTop()setSelectionAfterHeaderView(), nhưng không có tiện ích nào trong số chúng dường như làm những gì tôi muốn.Danh sách cài đặtXem vị trí cuộn độc đáo trong Android

Cho một mục trong danh sách, tôi muốn cuộn để nó được xem. Nếu mục nằm phía trên cửa sổ hiển thị của danh sách, tôi muốn cuộn cho đến khi mục đó là mục hiển thị đầu tiên trong danh sách; nếu mục nằm bên dưới cửa sổ hiển thị, tôi muốn nó cuộn lên cho đến khi nó là mục hiển thị cuối cùng trong danh sách. Nếu mục đã hiển thị, tôi không muốn bất kỳ thao tác cuộn nào xuất hiện.

Tôi làm cách nào để thực hiện việc này?

+0

Tại sao những phương pháp bạn đã đề cập không hoạt động? Điều gì sẽ xảy ra khi bạn setSelection trên mục bạn muốn? (Tôi biết đó là một câu hỏi cũ. Nếu bạn đã giải quyết vấn đề này bây giờ, hãy đăng giải pháp của bạn, tôi sẽ đánh giá cao nó) – HXCaine

+0

@ T3Roar: Tôi đã giải quyết nó, với sự kết hợp của setSelection() và setSelectionFromTop(), lo lắng về chiều cao danh sách và chiều cao mục, và tất nhiên vị trí của mục trong danh sách. Đó là một mớ hỗn độn, tôi sợ, và tôi không thể chia sẻ mã - nhưng nó có thể giải quyết được. Có lẽ nếu tôi có cơ hội, tôi sẽ viết một giải pháp chung mà tôi có thể chia sẻ, nhưng những gì tôi có ngay bây giờ không phải là hữu ích ngoài bối cảnh mà tôi có nó. Xin lỗi! –

+1

Vâng tôi rất vui vì nó chỉ mất một số sử dụng setSelection() để đạt được chứ không phải là một số workaround điên khác. Cảm ơn bạn đã trả lời :) – HXCaine

Trả lời

15

Điều này xảy ra do chưa tạo danh sách. Cố gắng gửi Runnable như:

getListView().postDelayed(new Runnable() {   
    @Override 
    public void run() { 
     lst.setSelection(15); 
    } 
},100L); 
4

Tôi nghĩ rằng, tôi đang tìm kiếm giống nhau, sau đó tôi tìm thấy giải pháp sau đây:

if (listview.getFirstVisiblePosition() > pos 
    || listview.getLastVisiblePosition() <= pos) { 
    listview.smoothScrollToPosition(pos); 
} 

API 8 là cần thiết để sử dụng smoothScrollToPosition (đó là một anyways tối thiểu hợp lý) để bạn biết.

3

Câu trả lời của Sergey hoạt động, nhưng tôi tin rằng cách đúng đắn để thực hiện việc này là thiết lập một người quan sát để được thông báo khi ListView được tạo.

listView.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() { 
@Override 
public void onGlobalLayout() { 
    scrollTo(scrollToPosition); 
    listView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
} 
}); 
+1

đây là giải pháp tốt hơn nhưng đừng quên xóa người nghe: http://developer.android.com/reference/android/view/ViewTreeObserver.html#removeGlobalOnLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener) – Rocel

+0

Cảm ơn bạn Rocel. Dòng listView.getViewTreeObserver(). RemoveGlobalOnLayoutListener (this) làm điều đó –

0

Một giải pháp tốt hơn để Sergey's answer là để gọi setSelection() sau trong vòng đời Hoạt động/Fragment, có lẽ trong onStart(). Bằng cách đó, bạn có một đảm bảo rằng Chế độ xem sẵn sàng thay vì sử dụng một số độ trễ tùy ý.

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