android 的ListView中,如何判断其内容已滚动到最顶部或者最底部?

根据这个方法检测:

 1 getListView().setOnScrollListener(new OnScrollListener() {
 2             @Override
 3             public void onScrollStateChanged(AbsListView view, int scrollState) {
 4             }
 5 
 6             @Override
 7             public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
 8                 if(firstVisibleItem==0){
 9                     Log.e("log", "滑到顶部");
10                 }
11                 if(visibleItemCount+firstVisibleItem==totalItemCount){
12                     Log.e("log", "滑到底部");
13                 }
14             }
15         });

 from:http://ask.csdn.net/questions/459

这是另外一种 在底部

listView.setOnScrollListener(new OnScrollListener() { 
    
    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     // 当不滚动时 
     if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { 
      //判断是否滚动到底部 
      if (view.getLastVisiblePosition() == view.getCount() - 1) { 
       adapter.count += 10;  
                   adapter.notifyDataSetChanged(); 
                   int currentPage=adapter.count/10; 
                   Toast.makeText(getApplicationContext(), "第"+currentPage+"页", Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 
    
    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, 
      int visibleItemCount, int totalItemCount) { 
     // TODO Auto-generated method stub 
     
    } 
   });

 

ListView实现滑动到底部加载更多

平时刷网页的时候当我们滑动到网页底部,网页会自动加载更多数据方便我们的浏览,比较典型的例子就是Twitter。

在安卓上也可以看见这样的设计,尤其被使用在ListView中。当ListView滑动到底部的时候会显示进度条并且加载更多数据。

实现这个功能的方法很简单,只需要调用ListViewsetOnScrollListener()方法即可。

调用setOnScrollListener()方法需要重写两个方法,一个是onScrollStateChanged()方法,用来判断ListView当前的滑动状态;一个是onScroll()方法,用来检测ListView当前的视图状态。在这里我们只需要使用onScroll()方法即可。详细的过程见下方的代码和注释。

listView.setOnScrollListener(new AbsListView.OnScrollListener() {
    /*
     * 定义一个布尔变量,
     * 用于判断滑动方向是否向下
     */
    private boolean moveToBottom = false;

    /*
     * 定义一个整型变量,
     * 用于记录ListView之前可见的第一个列表项的索引值,
     * 主要用于判断ListView的滑动方向是否向下,
     * 具体的使用方法见下方
     */
    private int previous = 0;

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        /* 什么也不需要做 */
    }

    /*
     * view指报告当前状态的视图;
     * firstVisibleItem表示ListView当前可见的第一个列表项的索引值;
     * visibleItemCount表示ListView当前可见的列表项的个数;
     * totalItemCount表示ListView总共的列表项个数
     *
     * 当ListView滑动到底部的时候,
     * totalItemCount == firstVisibleItem + visibleItemCount;
     * 但是满足上述条件时ListView却不一定是向下滑动的,
     * 所以我们需要加入一个判断向下滑动的条件,
     * 只需要循环对比ListView之前可见的第一个列表项的索引值previous和当前可见的第一个列表项的索引值firstVisibleItem,
     * 当previous < firstVisibleItem时列表向下滑动,
     * 当previous > firstVisibleItem时列表向上滑动,
     * 记住对比结束之后要将firstVisibleItem赋值给previous,
     * 方便下次比较
     */
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        if (previous < firstVisibleItem) {
            moveToBottom = true;
        } else if (previous > firstVisibleItem) {
            moveToBottom = false;
        }
        previous = firstVisibleItem;

        if (totalItemCount == firstVisibleItem + visibleItemCount && moveToBottom) {
            /* 需要加载更多数据的代码 */
        }
    }
});

底部自动加载适用于分页加载大量数据,但是当数据量较小时这个功能反而成了累赘,比如说全部的数据量可能也就一个屏幕大小,只要稍微向下滑动一下就会开始加载,但是这样的加载却是不必要的。解决这个问题的方法也很简单,只需要修改一下加载更多的判断条件,当totalItemCount小于某个值的时候就不加载数据了;类似地你也可以指定数据量,当达到totalItemCount达到某个数据量的时候就不加载数据了。

from:http://mthli.github.io/post/ListView%E5%AE%9E%E7%8E%B0%E6%BB%91%E5%8A%A8%E5%88%B0%E5%BA%95%E9%83%A8%E5%8A%A0%E8%BD%BD%E6%9B%B4%E5%A4%9A.html

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。