2012-06-23 31 views
16

Làm thế nào để bạn biết nếu ListView của bạn có đủ số mục để nó có thể cuộn?Làm cách nào để kiểm tra xem một ListView của tôi có số lượng mục có thể cuộn không?

Ví dụ: Nếu tôi có 5 mục trên ListView, tất cả các mục đó sẽ được hiển thị trên một màn hình. Nhưng nếu tôi có 7 hoặc nhiều hơn, ListView của tôi bắt đầu cuộn. Làm cách nào để biết Danh sách của tôi có thể cuộn theo chương trình không?

+0

Tại sao bạn cần biết điều này? Sau khi tất cả, câu trả lời có thể thay đổi về thay đổi hướng và câu trả lời có thể thay đổi dựa trên những gì có trong hàng của bạn (các bố cục hàng khác nhau, 'chiều cao' wrap_content thay đổi dựa trên văn xuôi). Bạn đang cố gắng đạt được điều gì? – CommonsWare

+0

5 mục không thể cuộn trên hdpi 800x480, nhưng có thể cuộn trên ldpi 240x320, hãy để android xử lý cuộn cho bạn! Trong thực tế, tư tưởng của CommonsWare, đã trải qua tâm trí tôi, tôi muốn nói - Tại sao bạn lại muốn làm điều này? – t0mm13b

+0

@CommonsWare, tuyệt đối tôi hiểu điều đó. Tôi muốn hiển thị chân trang ở cuối hoạt động. Nếu cuộn ListView, tôi muốn đặt hình ảnh chân trang làm dạng xem chân trang của ListView. Khác tôi có thể thiết lập khả năng hiển thị của một chân trang khác được đặt ở cuối bố cục của hoạt động. –

Trả lời

-1

Sử dụng setOnScrollListener, bằng cách áp dụng gọi lại đến OnScrollListener, bạn có thể xác định xem việc cuộn có diễn ra hay không bằng cách sử dụng các hằng số được xác định trước và xử lý tình huống tương ứng.

+0

Tôi sẽ chỉ nhận được cuộc gọi lại nếu sự kiện xảy ra, phải không? Nhưng bố cục phải được thay đổi ngay cả trước khi người dùng tìm cách cuộn danh sách. –

1

Bạn không thể phát hiện điều này trước khi Android hiển thị màn hình với listView. Tuy nhiên, bạn hoàn toàn có thể phát hiện bài đăng này.

boolean willMyListScroll() {   
    if(listView.getLastVisiblePosition() + 1 == listView.getCount()) { 
     return false; 
    } 

    return true;    
} 

Điều này sẽ kiểm tra xem cửa sổ hiển thị có thể xem tất cả các mục trong danh sách của bạn hay không. Nếu có thể, thì listView sẽ không bao giờ cuộn và getLastVisiblePosition() sẽ luôn bằng tổng số mục trong dataAdapter của danh sách.

+0

Xin chào, cảm ơn. Nhưng nếu mục cuối cùng được hiển thị một nửa trên màn hình thì chế độ xem danh sách cũng sẽ cuộn. –

+0

Xóa phần "+1" của công việc trả lời của Diegosan? –

+1

Không, điều này sẽ không làm cho câu trả lời của mình hoạt động. Kiểm tra câu trả lời của tôi dưới đây. –

13

Câu trả lời của Diegosan không thể phân biệt được khi mục cuối cùng hiển thị một phần trên màn hình. Đây là một giải pháp cho vấn đề đó.

Đầu tiên, ListView phải được hiển thị trên màn hình trước khi chúng tôi có thể kiểm tra xem nội dung của nó có thể cuộn được không. Điều này có thể được thực hiện với một ViewTreeObserver:

ViewTreeObserver observer = listView.getViewTreeObserver(); 
    observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

     @Override 
     public void onGlobalLayout() { 
      if (willMyListScroll()) { 
       // Do something 
      } 
     } 
    }); 

Và đây là willMyListScroll():

boolean willMyListScroll() { 
    int pos = listView.getLastVisiblePosition(); 
    if (listView.getChildAt(pos).getBottom() > listView.getHeight()) { 
     return true; 
    } else { 
     return false; 
    } 
} 
+2

Giải pháp tuyệt vời - kiểm tra null cần được thêm vào phương thức willMyListScroll() cho getChildAt (pos). Nếu danh sách trống, nó sẽ sụp đổ: D – HelloImKevo

+2

Tôi tin rằng điều này là sai. getChildAt() chỉ tính các trẻ em có thể nhìn thấy trên màn hình. Trong khi đó, getLastVisiblePosition trả về chỉ mục dựa trên Adapter. Vì vậy, nếu lastVisiblePosition là 8 vì nó là mục thứ 9 trong danh sách và chỉ có 4 mục nhìn thấy được trên màn hình, bạn sẽ gặp sự cố. Xác minh bằng cách gọi getChildCount() và xem. Các chỉ mục cho getChildAt không giống như các chỉ mục cho tập dữ liệu. Kiểm tra điều này: http://stackoverflow.com/questions/6766625/listview-getchildat-returning-null-for-visible-children – jacosta

0

Đây là cách tôi sử dụng để kiểm tra

if (listView.getAdapter() != null 
        && listView.getLastVisiblePosition() == listView.getAdapter().getCount() - 1 
        && listView.getChildAt(listView.getChildCount() - 1).getBottom() == listView.getBottom()) 

nếu nó mang lại cho đúng, sau đó danh sách là phía dưới

3

Theo nhận xét của tôi về câu trả lời của Mike Ortiz, tôi tin câu trả lời của anh ấy sai:

getChildAt() chỉ đếm số trẻ em có thể nhìn thấy trên màn hình. Trong khi đó, getLastVisiblePosition trả về chỉ mục dựa trên Adapter. Vì vậy, nếu lastVisiblePosition là 8 vì nó là mục thứ 9 trong danh sách và chỉ có 4 mục nhìn thấy được trên màn hình, bạn sẽ gặp sự cố. Xác minh nó bằng cách gọi getChildCount() và xem. Các chỉ mục cho getChildAt không giống như các chỉ mục cho tập dữ liệu. Check this out: ListView getChildAt returning null for visible children

Đây là giải pháp của tôi:

public boolean isScrollable() { 
     int last = listView.getChildCount()-1; //last visible listitem view 
     if (listView.getChildAt(last).getBottom()>listView.getHeight() || listView.getChildAt(0).getTop()<0) { //either the first visible list item is cutoff or the last is cutoff 
       return true; 
     } 
     else{ 
      if (listView.getChildCount()==listView.getCount()) { //all visible listitem views are all the items there are (nowhere to scroll) 
       return false; 
      } 
      else{ //no listitem views are cut off but there are other listitem views to scroll to 
       return true; 
      } 
     } 
    } 
+0

Giải pháp này cũng sẽ hoạt động ngay cả sau khi bạn đã cuộn đến một điểm trên danh sách hoặc được xoay điện thoại. Nó không bị giới hạn trong một cuộc gọi ngay sau khi tải ban đầu của danh sách – jacosta

-2
boolean listBiggerThanWindow = appHeight - 50 <= mListView.getHeight(); 

      Toast.makeText(HomeActivity.this, "list view bigger that window? " + listBiggerThanWindow, Toast.LENGTH_LONG) 
        .show(); 

      if (listBiggerThanWindow) { 
       // do your thing here... 
       } 

bạn có thể nhận được kích thước trong onCreate() bằng cách gọi đường bưu điện (Runnable) trên View.

+0

bạn sử dụng appHeight - 50. appHeight là gì, đo lường của nó là gì (px, dp, dip .. etc?). Vui lòng thêm thông tin. –

1

Đây là mã tôi đã viết cho thấy một bức tranh sau khi hàng cuối cùng của listview:

public class ShowTheEndListview 
{ 
    private ImageView the_end_view; 
    private TabbedFragRootLayout main_layout; 
    private ListView listView; 
    private float pas; 
    private float the_end_img_height; 
    private int has_scroll = -1; 

    public ShowTheEndListview(float height) 
    { 
     the_end_img_height = height; 
     pas = 100/the_end_img_height; 
    } 

    public void setData(ImageView the_end_view, TabbedFragRootLayout main_layout, ListView listView) 
    { 
     this.the_end_view = the_end_view; 
     this.main_layout = main_layout; 
     this.listView = listView; 
    } 

    public void onScroll(int totalItemCount) 
    { 
     if(totalItemCount - 1 == listView.getLastVisiblePosition()) 
     { 
      int pos = totalItemCount - listView.getFirstVisiblePosition() - 1; 
      View last_item = listView.getChildAt(pos); 

      if (last_item != null) 
      { 
       if(listHasScroll(last_item)) 
       { 
//      Log.e(TAG, "listHasScroll TRUE"); 
       } 
       else 
       { 
//      Log.e(TAG, "listHasScroll FALSE"); 
       } 
      } 
     } 
    } 

    private boolean listHasScroll(View last_item) 
    { 
     if(-1 == has_scroll) 
     { 
      has_scroll = last_item.getBottom() > (main_layout.getBottom() - the_end_img_height - 5) ? 1 : 0; 
     } 

     return has_scroll == 1; 
    } 

    public void resetHasScroll() 
    { 
     has_scroll = -1; 
    } 
} 
1

AbsListView bao gồm này:

/** 
* Check if the items in the list can be scrolled in a certain direction. 
* 
* @param direction Negative to check scrolling up, positive to check scrolling down. 
* @return true if the list can be scrolled in the specified direction, false otherwise. 
* @see #scrollListBy(int) 
*/ 
public boolean canScrollList(int direction); 

Bạn cần phải ghi đè layoutChildren() và sử dụng nó trong đó:

@Override 
protected void layoutChildren() { 
    super.layoutChildren(); 
    isAtBottom = !canScrollList(1); 
    isAtTop = !canScrollList(-1); 
} 
Các vấn đề liên quan