使用ListVIew解决请求数据自动翻页和自动加载更多的动能

    对于经常做网络请求的程序员来说,经常会遇到请求的数据存在好几页,而我们一次请求只能将其中的一页来处理,那么有没有什么办法能够让请求的数据自动翻页呢?其次,从APP性能上来讲,假如我一页数据有20条,那么一定要全部都在同一时间开始解析吗,我们的手机屏幕不大,一次也显示不了那么多数据(一些特例除外),这样无疑给APP的性能或多或少的造成了困扰。

  其实,想要解决上述的问题比我们想象中还要容易很多,废话不多说,我们直接开始解决问题~~

  

  前提: 

/**
*每页数据有二十条
*/
API = “http:www.XXXXXXXXX.com/page=1,2,3,4...”,

  当然,为了大家能够普遍使用,我们使用ListView来做为实验对象(ListView的代码我就不贴了,自己写就好)

  开始:

  其实第一步很简单,大家也知道,在xml中写了ListView,肯定就要在Activity文件中findVIewById一下(作者在Fragment里面)

 

/**
* Created by Dragon丶Lz on 2016/1/22.
*/
public class EssayFragment extends Fragment implements AbsListView.OnScrollListener,AdapterView.OnItemClickListener {

private ListView essay_listview;
  private int page =1;


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment_essay,container,false);
initView(view);

initRefresh();
return view;
}

private void initView(View v){

essay_listview = (ListView) v.findViewById(R.id.esssay_lv);


}



}

 

  

 

  由于我们是做网络请求,所以第一步很简单,当然是请求数据,而且我们暂且设定page为第一页,因为一般的数据都是从第一页开始读取:

  

/**
 * Created by Dragon丶Lz on 2016/1/22.
 */
public class EssayFragment extends Fragment implements AbsListView.OnScrollListener,AdapterView.OnItemClickListener {

    private ListView essay_listview;
   private int page =1;


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      
        View view = inflater.inflate(R.layout.fragment_essay,container,false);
        initView(view);
       getDataByHttp(page);
        initRefresh();
        return view;
    }

    private void initView(View v){

        essay_listview = (ListView) v.findViewById(R.id.esssay_lv);


    }
    private void getDataByHttp(int page){
           /**
            *这里自己完成网络请求的任务
            */
          Message message = new Message();
                message.what = SHOW_RESPONSE;
                message.obj = response;
                messageHttp = response;
                mHandler.sendMessage(message);
               
    }

 private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
               
                case SHOW_RESPONSE:
                   
                    break;
                default:
                    break;
            }
        }

    };
    
}            

  这里可以发现,我是用了一个page作为页数的参数来传进去,这就意味着我们在后面必须动态的改变page值来实现翻页。

/**
 * Created by Dragon丶Lz on 2016/1/22.
 */
public class EssayFragment extends Fragment implements AbsListView.OnScrollListener,AdapterView.OnItemClickListener {

    private ListView essay_listview;
        
private int page =1; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_essay,container,false); initView(view); getDataByHttp(page); initRefresh(); return view; } private void initView(View v){ essay_listview = (ListView) v.findViewById(R.id.esssay_lv); } private void getDataByHttp(int page){ /** *这里自己完成网络请求的任务 */ Message message = new Message(); message.what = SHOW_RESPONSE; message.obj = response; messageHttp = response; mHandler.sendMessage(message); } private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case SHOW_RESPONSE: dealResponse(msg.obj, 0); break; default: break; } } }; private void dealResponse(Object msg,int startPosition) { /** *这里处理数据解析 */ } }

  这与我们平常做一些简单的网络请求是一模一样的,好了,也就不多说了,继续看  

一次加载十个数据

  

  private void response(Object msg,int startPosition) {

        /**
         *这里做解析数据 
         */
        for (int i = startPosition; i < list.size() && i < startPosition + 10; i++) {
            dataList.add(list.get(i));
        }

        adapter.notifyDataSetChanged();
    }        

 

首先dataList就是我们存在adapter中的List<> ,list则是一页所有数据的总和我们每次都会从开始的位置statPosition开始加10来做处理,至于stratPosition在哪里变化先不着急管我们慢慢往下看

 

 自动翻页

/**
 * Created by Dragon丶Lz on 2016/1/22.
 */
public class EssayFragment extends Fragment implements AbsListView.OnScrollListener,AdapterView.OnItemClickListener {

    private ListView essay_listview;
     
   private int page =1;


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      
        View view = inflater.inflate(R.layout.fragment_essay,container,false);
        initView(view);
       getDataByHttp(page);
        initRefresh();
        return view;
    }

    private void initView(View v){

        essay_listview = (ListView) v.findViewById(R.id.esssay_lv);


    }
    private void getDataByHttp(int page){
           /**
            *这里自己完成网络请求的任务
            */
          Message message = new Message();
                message.what = SHOW_RESPONSE;
                message.obj = response;
                messageHttp = response;
                mHandler.sendMessage(message);
               
    }

 private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
               
                case SHOW_RESPONSE:
                   dealResponse(msg.obj, 0);
                    break;
                default:
                    break;
            }
        }

    };
    
     private void dealResponse(Object msg,int startPosition) {

        /**
         *这里处理数据解析
         */ 
      ... } @Override
public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { scrollFlag = true; } else { scrollFlag = false; } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (firstVisibleItem + visibleItemCount == totalItemCount) { if (messageHttp != null) { if (totalItemCount != (page - 1) * numbersInOnePage) { if (totalItemCount < numbersInOnePage * page) { dealResponse(messageHttp, totalItemCount - (page - 1) * numbersInOnePage); } else { getDataByHttp(++page); } } } } } }

  我们调用了OnScrollListener这个监听,并且实现了两个方法,我们的关注重点在onScroll,在这里面的一些算法通过名字大家也可以很快的了解:

  1.   numbersInOnePage----------单页数据的个数

      2.       totalItemCount       ----------listview一共加载了的item个数

  在这里面,我们使用了一个if 语句来进行判断,如果我们totalItemCount不等于(page - 1) * numbersInOnePage 则说明当前页还没有加载完,那么我们就继续调用解析的方式,但是注意我们的stratPosition---》》》totalItemCount - (page - 1) * numbersInOnePage,这个值大家可以自己去想想和测试一下,这里不做过多的解释。

  如果等于的话,说明正好本业就已经加载完毕了,那么page++来进行翻页的功能。

 

  到这里是不是觉得豁然开朗了呢,其实自动加载和自动翻页没有那么麻烦对吧~~~~

  版权声明:本文为博主原创文章,转载请注明来源谢谢。

  

posted @ 2016-02-23 15:22  Dragon丶Lz  阅读(337)  评论(0)    收藏  举报