2012-08-09 42 views
6

Tôi có một chế độ xem danh sách được bổ sung chế độ xem bổ sung theo yêu cầu, được duy trì bởi BaseAdapter. Làm thế nào tôi có thể duy trì vị trí cuộn sau khi cập nhật?Android ListView - cuộn trở lại đầu trang khi cập nhật

Tôi biết điều này đã được hỏi một vài lần, nhưng mỗi lần, cùng một giải pháp đã được đưa ra, mà tôi đã thử, đó là gọi adapter.notifyDataSetChanged(); sau khi cập nhật ArrayList chứa nội dung danh sách.

Làm cách nào để đảm bảo rằng vị trí cuộn được duy trì?

+1

vui lòng bao gồm mã của bạn. –

Trả lời

12

Thực hiện một OnScrollListener trong lớp hoạt động của bạn và sau đó sử dụng đoạn mã sau:

int currentFirstVisibleItem, currentVisibleItemCount, currentTotalItemCount; 
public void onScroll(AbsListView view, int firstVisibleItem, 
     int visibleItemCount, int totalItemCount) { 
    this.currentFirstVisibleItem = firstVisibleItem; 
    this.currentVisibleItemCount = visibleItemCount; 
    this.currentTotalItemCount = totalItemCount; 
} 

public void onScrollStateChanged(AbsListView view, int scrollState) { 
    this.currentScrollState = scrollState; 
    this.isScrollCompleted(); 
} 

private void isScrollCompleted() { 

    if (currentFirstVisibleItem + currentVisibleItemCount >= currentTotalItemCount) { 
     if (this.currentVisibleItemCount > 0 
       && this.currentScrollState == SCROLL_STATE_IDLE) { 

      //Do your work 
     } 
    } 
} 

Nếu bạn đang sử dụng AsyncTask để cập nhật dữ liệu của bạn, sau đó bạn có thể bao gồm thông tin sau trong số PostExecute() của bạn để duy trì vị trí Di chuyển:

list.setAdapter(adapter); 
list.setSelectionFromTop(currentFirstVisibleItem, 0); 

Tôi hy vọng điều này sẽ hữu ích.

+0

ý của bạn là gì // Làm công việc của bạn. Còn gì nữa để làm? – ajacian81

+0

Trong // Làm công việc của bạn, bạn có thể viết mã của bạn như bất cứ điều gì bạn muốn làm trên hoàn thành cuộn .. Ví dụ, giống như Facebook nếu bạn muốn tải thêm dữ liệu trên Cuộn xuống, bạn có thể viết mã cho điều đó ở đây .. –

+0

Công việc này tốt cho việc thêm chân trang ... Tôi cần thêm tiêu đề vào listview để làm mới. Vì vậy, xin vui lòng cho tôi một điều kiện để thêm tiêu đề vào listview – Arun

5

Cách tiếp cận tôi thực hiện là gọi ListView.setSelection(position) để cuộn đến mong muốn position sau khi cập nhật.

Tùy thuộc vào nơi bạn đang gọi điện thoại từ đó, bạn có thể cần gọi requestFocusFromTouch trước khi gọi setSelection để đảm bảo mục được định vị một cách thích hợp.

+0

Cuộc gọi đến requestFocusFromTouch là bước mất tích quan trọng đối với tôi! – Newtz

+1

YESSSSSSSSSSS, tôi sẽ ôm bạn nếu tôi có thể. Quá lâu để khắc phục vấn đề này – Vfleitao

2

Bạn có thể thử này:

//Get the top position from the first visible element 
int fVisible = list.getFirstVisiblePosition(); 
View vFirst = list.getChildAt(0); 
int pos = 0; 
if (vFirst != null) pos = vFirst.getTop(); 

//Restore the position 
list.setSelectionFromTop(fVisible, pos); 
+0

Thật không may, đáng ngạc nhiên là không hiệu quả. Sau khi đăng nhập, sau khi di chuyển đến vị trí mong muốn, nó chỉ cần đặt lại vị trí và quay trở lại đầu trang. – ajacian81

+0

ajacian81 Kiểm tra giải pháp mới mà tôi đã đăng ... Tôi hy vọng điều này sẽ giúp ... –

3

Mã này sẽ giúp bạn ra ngoài ....

// get position of listview 
int index = listView.getFirstVisiblePosition(); 
View v = listView.getChildAt(0); 
int top = (v == null) ? 0 : v.getTop(); 

// notify dataset changed or re-assign adapter here 

//re-assign the position of listview after setting the adapter again 
listView.setSelectionFromTop(index, top); 

Cheers :)

+0

Hoàn hảo, nó giống như bộ điều hợp không bao giờ thay đổi, ngoài việc cập nhật chế độ xem có liên quan, trong trường hợp của tôi chuyển sang hình ảnh được nhấp trong bố cục danh sách! Cảm ơn nhiều!! – WallyHale

0

Bạn có thể làm như sau. Nếu bạn muốn tải thêm dữ liệu với cuộn xuống dưới, nó sẽ có một số thay đổi.

int currentFirstVisibleItem, currentScrollState; 
int countChange = 0; 
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
    Log.d("Scroll", "Scrolling"); 
    this.currentFirstVisibleItem = firstVisibleItem; 
    countChange = 0;//during touching you can decide not to refresh by scroll 
} 

public void onScrollStateChanged(AbsListView view, int scrollState) { 
    Log.d("Scroll", "Changed"); 
    this.currentScrollState = scrollState; 
    if (scrollState == SCROLL_STATE_TOUCH_SCROLL) { 
     countChange = 0; 
    } 
    if (++countChange > 1) { 
     //scroll to top and release touch change=2. Simple scroll and release touch change=1 
     this.isScrollCompleted(); 
     countChange = 0; 
    } 
} 

private void isScrollCompleted() { 
    Log.d("Load", "Reload"); 
    if (currentFirstVisibleItem == 0) { 
     //Your loading go here 
    } 
} 
+0

Vâng, đây là hình thức mã không phải hình ảnh. Tôi chỉ cố gắng viết mã. Nó không phải là một văn bản thông thường như mã trong IDE. –

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