Android数据分批载入-滑动究竟部自己主动载入列表

2014年5月9日

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

本博文介绍怎样进行数据分批载入,在应用开发其中会常常使用到ListView。点击很多其它载入数据是我们常常简单,为了提供用户体验。当用户将列表滚动究竟部自己主动载入数据。这种形式用得比較多。

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

详细代码实现:

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

  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(0, 20));
  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

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

效果图例如以下:

Android数据分批载入-滑动究竟部自己主动载入列表的更多相关文章

  1. [JS前端开发] js/jquery控制页面动态载入数据 滑动滚动栏自己主动载入事件

    本人小菜鸟一仅仅.为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识,小菜鸟创建了一个群.希望光临本博客的人能够进来交流.寻求 ...

  2. 让Android Support V4中的SwipeRefreshLayout支持上拉载入很多其它

    前言 原来的Android SDK中并没有下拉刷新组件,可是这个组件确实绝大多数APP必备的一个部件.好在google在v4包中出了一个SwipeRefreshLayout.可是这个组件仅仅支持下拉刷 ...

  3. Android实现RecyclerView的下拉刷新和上拉载入很多其它

    需求 先上效果图, Material Design风格的下拉刷新和上拉载入很多其它. 源代码地址(欢迎star) https://github.com/studychen/SeeNewsV2 假设对于 ...

  4. Android三种左右滑动效果 手势识别

    Android三种左右滑动效果 手势识别(转)   手势识别 1.onCreate中添加GestureDetector mGestureDetector; //监听手势事件 mGestureDetec ...

  5. TabTopAutoLayout【自定义顶部选项卡区域(带下划线)(动态选项卡数据且可滑动)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 自定义顶部选项卡布局LinearLayout类,实现带下划线且可滑动效果.[实际情况中建议使用RecyclerView] 备注:如果 ...

  6. TabTopAutoTextSizeLayout【自定义文字字号区域(动态选项卡数据且可滑动)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 自定义顶部选项卡布局LinearLayout类,实现可滑动效果.[实际情况中建议使用RecyclerView] 对<TabTo ...

  7. (七十一)关于UITableView退出崩溃的问题和滚动究竟部的方法

    [TableView退出崩溃的问题] 近期在使用TableView时偶然发如今TableView中数据较多时,假设在滚动过程中退出TableView到上一界面.会引起程序的崩溃.经过网上查阅和思考我发 ...

  8. Android数据存储之SQLCipher数据库加密

    前言: 最近研究了Android Sqlite数据库(文章地址:Android数据存储之Sqlite的介绍及使用)以及ContentProvider程序间数据共享(Android探索之ContentP ...

  9. Android数据存储之GreenDao 3.0 详解

    前言: 今天一大早收到GreenDao 3.0 正式发布的消息,自从2014年接触GreenDao至今,项目中一直使用GreenDao框架处理数据库操作,本人使用数据库路线 Sqlite----> ...

随机推荐

  1. java实现多个数字求和_图形化界面

    一,设计思想 1,通过简单的窗口实现多个数字的输入与输出. 2,可通过用户输入数字的数量来实现多个数字的求和. 3,定义整型数组变量number和字符串型数组变量integer,将输入的字符串变量赋给 ...

  2. webstorm注册码注册

    最近jetbrains公司更新软件总是特别的快,很多私人搭建的server服务也失效了,现出一个能够永久破解的方法,非常简单,只需要2步就完成. 第一步 复制下方activation code,直接粘 ...

  3. ActiveMQ学习总结(4)——业界消息队列简介

    最近开发公司的短信平台,要用到消息队列,之前用的是亚马逊的SQS,考虑到后续业务发展,对消息推送的高并发要求,公司决定采用RabbitMQ来替换.借此机会开始熟悉各种MQ产品,下面先给大家简介下业界常 ...

  4. cocos2d-x-3.3rc2-003 cocos中的引用计数和自己主动释放池

    点击打开链接

  5. mysql int(m)与int(m)的差别

    预计大多数開始接触mysql的朋友们都会有这个问题:int(M) 里面的数值究竟是什么意思? 依据相关资料总结了下: int(M) zerofill,加上zerofill后M才表现出有点点效果,比方  ...

  6. C#上传文件

    QQ:1187362408 欢迎技术交流和学习 关于C#上传文件(产品开发): TODO: 1.文件大小不足500M(web.config配置直接处理) 2,文件大小超过500M(ASP.NET分段读 ...

  7. Android上方便地开发的C程序

    假设你基于没有一个专门的开发板练手.那你的Android手机也能够开发大多数C应用程序.安装好后编译C的编译器. 本文仅仅写一个Hello World的执行过程. 长处是:不须要eclipse,不须要 ...

  8. iOS:简单使用UIAlertVIew和UIActionSheet

    做iOS开发的同学想必都用过UIAlertVIew或者UIActionSheet.UIAlertVIew 可以弹出一个出现在屏幕中间的提示视图,给用户展示信息,并让用户自己选择操作,UIActionS ...

  9. 山东理工oj--1912--IP地址(水题)

     IP地址 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 2011年2月3日,国际互联网名称与数字地址分配机构(ICANN) ...

  10. 读取XML字符串到临时表

    DECLARE @hdoc int DECLARE @doc xml SET @doc = '<CityValueSet> <CityItem> <CityId>2 ...