如何检查我的ListView是否有可滚动的项目数量?

你怎么知道你的ListView是否有足够数量的项目,以便它可以滚动?

例如,如果我的ListView上有5个项目,它将全部显示在一个屏幕上。 但是如果我有7个或更多,我的ListView开始滚动。 我如何知道我的列表是否可以以编程方式滚动?

Related of "如何检查我的ListView是否有可滚动的项目数量?"

当最后一个项目在屏幕上部分可见时,Diegosan的答案无法区分。 这是解决这个问题的方法。

首先,必须在屏幕上呈现ListView,然后才能检查其内容是否可滚动。 这可以通过ViewTreeObserver完成:

 ViewTreeObserver observer = listView.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (willMyListScroll()) { // Do something } } }); 

这里是willMyListScroll()

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

根据我对Mike Ortiz的回答的评论,我相信他的回答是错误的:

getChildAt()只对在屏幕上可见的子项进行计数。 同时,getLastVisiblePosition返回基于Adapter的索引。 所以如果lastVisiblePosition是8,因为它是列表中的第9个项目,并且屏幕上只有4个可见项目,你将会崩溃。 通过调用getChildCount()来validation它并查看。 getChildAt的索引与数据集的索引不同。 检查了这一点: ListView getChildAt为可见的孩子返回null

这是我的解决scheme:

 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; } } } 

在android使用listView渲染屏幕之前,你无法检测到这一点。 不过,你完全可以检测到这个后期渲染。

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

这样做是检查listView可见窗口是否包含所有列表视图项目。 如果可以,那么listView将永远不会滚动, getLastVisiblePosition()将始终等于列表的dataAdapter中的项目总数。

这是我为了在列表视图的最后一行之后显示图片而编写的代码:

 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; } } 

AbsListView包括:

 /** * 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); 

你需要重写layoutChildren()并在其中使用它:

 @Override protected void layoutChildren() { super.layoutChildren(); isAtBottom = !canScrollList(1); isAtTop = !canScrollList(-1); } 

这是我用来检查

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

如果它是真的,那么列表是在底部

使用setOnScrollListener ,通过将callback应用于OnScrollListener ,您可以确定是否使用预定义的常量进行滚动,并相应地处理情况。

  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... } 

您可以通过在View上调用post(Runnable)来获取onCreate()中的维度。