2012-11-01 25 views
17

Tôi có một ListView, trong đó có nhiều phần tử hơn, sau đó tôi có thể hiển thị cùng một lúc.Bây giờ tôi muốn có được Chỉ mục trên tất cả các Thành phần, hiển thị đầy đủ (-> loại trừ các phần có thể nhìn thấy). Tại thời điểm này, tôi sử dụng getFirstVisiblePosition() & getLastVisiblePosition() vào một số for-loop để lặp lại chúng, nhưng phương pháp này không chính xác như tôi muốn.Nhận tất cả các đối tượng hiển thị đầy đủ trên lListView

Có giải pháp nào tốt hơn?

Trả lời

30

Một ListView giữ cho các hàng của nó được sắp xếp trong danh sách từ trên xuống mà bạn có thể truy cập bằng getChildAt(). Vì vậy, những gì bạn muốn là khá đơn giản. Chúng ta hãy Views đầu tiên và cuối cùng, sau đó kiểm tra xem họ là hoàn toàn có thể nhìn thấy hay không:

// getTop() and getBottom() are relative to the ListView, 
// so if getTop() is negative, it is not fully visible 
int first = 0; 
if(listView.getChildAt(first).getTop() < 0) 
    first++; 

int last = listView.getChildCount() - 1; 
if(listView.getChildAt(last).getBottom() > listView.getHeight()) 
    last--; 

// Now loop through your rows 
for(; first <= last; first++) { 
    // Do something 
    View row = listView.getChildAt(first); 
} 

Addition

Bây giờ tôi muốn nhận được Index tắt tất cả các yếu tố, trong đó được hiển thị đầy đủ

Tôi không chắc chắn ý nghĩa của câu đó. Nếu mã trên không phải là chỉ số bạn muốn, bạn có thể sử dụng:

int first = listView.getFirstVisiblePosition(); 
if(listView.getChildAt(0).getTop() < 0) 
    first++; 

Để có một chỉ số đó là tương đối so với adapter của bạn (. Tức là adapter.getItem(first))

+0

Không bao giờ nói những gì tôi đã nói :) – Luksprog

+0

@Luksprog Đừng lo lắng. – Sam

+1

listView.getChildAt (index) .getTop() lừa công việc cho tôi..thanks – CoDe

1

Con đường tôi sẽ làm điều này là tôi sẽ mở rộng bất kỳ chế độ xem nào bạn đang truyền qua trong getView của bộ điều hợp ListView và ghi đè các phương pháp onAttachedToWindowonDetachedToWindow để theo dõi các chỉ mục hiển thị.

1

Hãy thử onScrollListner và bạn có thể sử dụng getFirstVisiblePosition và getLastVisiblePosition.

Liên kết this này có chứa loại vấn đề tương tự. Tôi cho rằng bạn có câu trả lời của bạn ở đó ..,.

+0

Cảm ơn bạn đã liên kết, nhưng vấn đề này là chính xác những gì tôi đã có, nó mang lại cho tôi không chỉ số của ListEntry những gì là hoàn toàn có thể nhìn thấy, nó trả về tất cả các mục trên màn hình... – Kooki

-1

Mã trên có phần chính xác. Nếu bạn cần tìm vị trí hiển thị hoàn toàn có thể nhìn thấy, hãy sử dụng mã bên dưới

public void onScrollStateChanged(AbsListView view, int scrollState) { 
    // TODO Auto-generated method stub 
    View v = null; 

    if (scrollState == 0) { 
     int first =0; 
     if (view.getChildAt(first).getTop() < 0) 
      first++; 
     int last = list.getChildCount() - 1; 
     if (list.getChildAt(last).getBottom() > list 
       .getHeight()) 
      last--; 
     // Now loop through your rows 
     for (; first <= last; first++) { 
      // Do something 

      View row = view.getChildAt(first); 
      // postion for your row............ 
      int i=list.getPositionForView(row); 
     } 
    } 
     // set the margin. 
} 
Các vấn đề liên quan