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

时间:2012-06-23 22:09:12

标签: android android-listview

你怎么知道你的ListView是否有足够数量的项目才能滚动?

例如,如果我的ListView上有5个项目,则所有项目都将显示在一个屏幕上。但如果我有7个或更多,我的ListView开始滚动。我怎么知道我的列表是否可以通过编程方式滚动?

8 个答案:

答案 0 :(得分:12)

当最后一项在屏幕上部分可见时,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;
    }
}

答案 1 :(得分:2)

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

getChildAt()仅计算屏幕上可见的子项。同时,getLastVisiblePosition返回基于Adapter的索引。因此,如果lastVisiblePosition为8,因为它是列表中的第9个项目,并且屏幕上只有4个可见项目,那么您将会崩溃。通过调用getChildCount()来验证它并查看。 getChildAt的索引与数据集的索引不同。看看这个:ListView getChildAt returning null for visible children

这是我的解决方案:

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

答案 2 :(得分:1)

在Android使用listView渲染屏幕之前,您无法检测到这一点。但是,您绝对可以检测到此后渲染。

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

   return true;             
}

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

答案 3 :(得分:1)

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

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

答案 4 :(得分: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);
}

答案 5 :(得分:0)

这是我以前检查的方式

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

如果它给出了真,那么列表就在底部

答案 6 :(得分:-1)

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

答案 7 :(得分:-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...
               }

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