7、Android数据分批加载-滑动到底部自动加载列表

Android数据分批加载-滑动到底部自动加载列表


2014年5月9日

摘自:《Android高级开发实战—ui、ndk与安全》

本博文介绍如何进行数据分批加载,在应用开发当中会经常使用到ListView,点击更多加载数据是我们经常简单,为了提供用户体验,当用户将列表滚动到底部自动加载数据,这样的形式用得比较多。

下面给大家提供的例子是,每次模拟20条数据,滑动到底部时再请求20条数据直到请求到限定页数为止

具体代码实现:

/08_Datapageload/src/com/wwj/datapageload/MainActivity.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.wwj.datapageload;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.os.Handler;  
  9. import android.util.Log;  
  10. import android.view.View;  
  11. import android.widget.AbsListView;  
  12. import android.widget.AbsListView.OnScrollListener;  
  13. import android.widget.ArrayAdapter;  
  14. import android.widget.ListView;  
  15.   
  16. public class MainActivity extends Activity {  
  17.     private ListView listView;  
  18.     private List<String> data = new ArrayList<String>();  
  19.     ArrayAdapter<String> adapter;  
  20.     View footer;  
  21.   
  22.     @Override  
  23.     protected void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_main);  
  26.         footer = getLayoutInflater().inflate(R.layout.footer, null);  
  27.   
  28.         listView = (ListView) findViewById(R.id.listView);  
  29.         listView.setOnScrollListener(new ScrollListener());  
  30.   
  31.         // 模拟数据  
  32.         data.addAll(DataService.getData(020));  
  33.         adapter = new ArrayAdapter<String>(this, R.layout.listview_item,  
  34.                 R.id.textView, data);  
  35.         listView.addFooterView(footer);// 添加页脚(放在ListView最后)  
  36.         listView.setAdapter(adapter);  
  37.         listView.removeFooterView(footer);  
  38.     }  
  39.   
  40.     private int number = 20// 每次获取多少条数据  
  41.     private int maxpage = 5// 总共有多少页  
  42.     private boolean loadfinish = true// 指示数据是否加载完成  
  43.   
  44.     private final class ScrollListener implements OnScrollListener {  
  45.   
  46.         @Override  
  47.         public void onScroll(AbsListView view, int firstVisibleItem,  
  48.                 int visibleItemCount, int totalItemCount) {  
  49.             Log.i("MainActivity""onScroll(firstVisibleItem="  
  50.                     + firstVisibleItem + ",visibleItemCount="  
  51.                     + visibleItemCount + ",totalItemCount=" + totalItemCount  
  52.                     + ")");  
  53.   
  54.             final int loadtotal = totalItemCount;  
  55.             int lastItemid = listView.getLastVisiblePosition(); // 获取当前屏幕最后Item的ID  
  56.             if ((lastItemid + 1) == totalItemCount) { // 达到数据的最后一条记录  
  57.                 if (totalItemCount > 0) {  
  58.                     // 当前页  
  59.                     int currentpage = totalItemCount % number == 0 ? totalItemCount  
  60.                             / number  
  61.                             : totalItemCount / number + 1;  
  62.                     int nextpage = currentpage + 1// 下一页  
  63.                     if (nextpage <= maxpage && loadfinish) {  
  64.                         loadfinish = false;  
  65.                         listView.addFooterView(footer);  
  66.   
  67.                         // 开一个线程加载数据  
  68.                         new Thread(new Runnable() {  
  69.   
  70.                             @Override  
  71.                             public void run() {  
  72.                                 try {  
  73.                                     Thread.sleep(3000);  
  74.                                 } catch (InterruptedException e) {  
  75.                                     e.printStackTrace();  
  76.                                 }  
  77.                                 List<String> result = DataService.getData(  
  78.                                         loadtotal, number);  
  79.                                 // 发送消息  
  80.                                 handler.sendMessage(handler.obtainMessage(100,  
  81.                                         data));  
  82.                             }  
  83.                         }).start();  
  84.                     }  
  85.                 }  
  86.             }  
  87.   
  88.         }  
  89.   
  90.         @Override  
  91.         public void onScrollStateChanged(AbsListView view, int scrollState) {  
  92.             Log.i("MainActivity""onScrollStateChanged(scrollState="  
  93.                     + scrollState + ")");  
  94.         }  
  95.   
  96.     }  
  97.   
  98.     private Handler handler = new Handler() {  
  99.         public void handleMessage(android.os.Message msg) {  
  100.             data.addAll((List<String>) msg.obj);  
  101.             // 告诉ListView数据已经发生改变,要求ListView更新界面显示  
  102.             adapter.notifyDataSetChanged();  
  103.             if (listView.getFooterViewsCount() > 0) { // 如果有底部视图  
  104.                 listView.removeFooterView(footer);  
  105.             }  
  106.             loadfinish = true// 加载完成  
  107.         };  
  108.     };  
  109.   
  110. }  

/08_Datapageload/src/com/wwj/datapageload/DataService.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.wwj.datapageload;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. public class DataService {  
  7.     public static List<String> getData(int offset, int maxResult) { // 分页limit  
  8.                                                                     // 0,20  
  9.         List<String> data = new ArrayList<String>();  
  10.         for (int i = 0; i < 20; i++) {  
  11.             data.add("ListView数据的分批加载" + i);  
  12.         }  
  13.         return data;  
  14.   
  15.     }  
  16. }  


效果图如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值