ListView分页加载数据小结

作者: Passon_Fang | 来源:发表于2016-03-13 14:07 被阅读1702次

    ListView分页加载数据小结

    效果描述

    分页:当用户在ListView界面上的时候不会加载全部的数据,而是从服务端加载一部分数据,当用户滑动ListView到末端的时候再从服务器加载更多数据。即:我们在使用新闻app的时候滑到底部才会加载新的内容。

    接口介绍:OnScrollListener

    // 静态属性
    public static int SCROLL_STATE_IDLE = 0; // 空闲状态
    public static int SCROLL_STATE_TOUCH_SCROLL = 1; // 滚动状态,并且手指在屏幕上
    public static int SCROLL_STATE_FLING = 2;    //    滚动状态,手指已经离开了屏幕
    
    // 抽象方法
    public void onScrollStateChanged(AbsListView view, int scrollState); 
    // ListView在状态改变的时候调用,用户在正常滑动的时候通常会执行三次(刻意滑动当listView停止的时候才将手离开屏幕执行两次)
    
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount); 
    // ListView在滚动的时候会反复调用该方法,调用次数和listView的子项无关(屏幕只要滑动一点就会调用)
    

    关键代码

    1. 设置成员属性:分页页码,默认1; 判断是否滑到底部的标记

       private int mPageNum = 1;
       private boolean isBottom;
      
    2. 设置LIstView滑动监听器

       mNewsListView.setOnScrollListener(new OnScrollListener() {
      
           @Override
           public void onScrollStateChanged(AbsListView view, int scrollState) {
               if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
                   if (isBottom) {
                       // 下载更多数据
                       Toast.makeText(MainActivity.this, "正在加载",
                               Toast.LENGTH_SHORT).show();        
                       //加载数据的方法代码.......
                       //这里面的代码通常是根据mPageNum加载不同的数据
                       // 对mPageNum处理: mPageNum++
                   
                   }
               }
           }
      
           @Override
           public void onScroll(AbsListView view, int firstVisibleItem,
                   int visibleItemCount, int totalItemCount) {
               if (firstVisibleItem + visibleItemCount == totalItemCount) {
                   // 说明:
                   // fistVisibleItem:表示划出屏幕的ListView子项个数
                   // visibleItemCount:表示屏幕中正在显示的ListView子项个数
                   // totalItemCount:表示ListView子项的总数    
                   // 前两个相加==最后一个说明ListView滑到底部
                   isButtom = true;
               }else{
                   isButtom = false;
               }
           }
       });
      

    mPageNum的用法

    1. 使用url获取数据

           String baseUrl = "http://litchiapi.jstv.com/";
           String newsUrl = "/api/GetFeeds?column=%d&PageSize=20&pageIndex=%d&val=100511D3BE5301280E0992C73A9DEC41";
           String url =  baseUrl + String.format(newsUrl, column, mPageNum++);
           
       column,mPageNum会分别替换newsUrl中的两个%d
      

    可能出现的疑问

    1. 为什么不把加载数据的代码写在onScroll()方法内,这样就可以省去一个成员变量:isBottom

           @Override
           public void onScroll(AbsListView view, int firstVisibleItem,
                   int visibleItemCount, int totalItemCount) {
               if (firstVisibleItem + visibleItemCount == totalItemCount) {
                   //加载更多数据
               }else{
                   //不记载新数据
               }
           }
      

      个人测试结果:由于onScroll执行次数是不可控的,当listView在滑动到底部的时候,onScroll在满足加载新数据条件的瞬间执行了很多次,从而加载了很多暂时不需要的数据。

      ListViewLog图
    2. 当ListView到达底部的时候,服务器没有更多数据可以加载。

      • 继续用手指滑动屏幕
      • 因为没有更多数据,所以屏幕ListView不会动
      • 这个时候:onScrollStateChanged方法会执行,但是onScroll方法不会执行

    相关文章

      网友评论

      本文标题:ListView分页加载数据小结

      本文链接:https://www.haomeiwen.com/subject/fzzxlttx.html