Listview分页加载数据的实现

public class MainActivity extends Activity {
	protected static final int SUCCESS_GET_DATA = 0;
	private ListView listview;
	private DataService service;
	private List<String> data;// 加载的总数据
	private ArrayAdapter<String> adapter;

	private boolean finish = true;// 是否加载完成

	private View footer;

	private Handler mHandler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case SUCCESS_GET_DATA:
				@SuppressWarnings("unchecked")
				ArrayList<String> result = ((ArrayList<String>) msg.obj);
				data.addAll(result);
				// 让listview自动刷新
				adapter.notifyDataSetChanged();
				finish = true;
				// 将页脚删除掉
				if (listview.getFooterViewsCount() > 0) {
					listview.removeFooterView(footer);
				}
				break;

			default:
				break;
			}
		};
	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		listview = (ListView) findViewById(R.id.listview);
		service = new DataService();
		data = new ArrayList<String>();
		List<String> result = service.getData(0, 20);
		data.addAll(result);
		adapter = new ArrayAdapter<String>(this, R.layout.item, R.id.tv_info,
				data);
		footer = View.inflate(this, R.layout.footer, null);
		// 在增加listview的页脚之前,需要提前设置一次
		listview.addFooterView(footer);
		listview.setAdapter(adapter);
		// 然后再次将页脚删除掉
		listview.removeFooterView(footer);
		// 滚动监听事件
		listview.setOnScrollListener(new MyOnScrollListener());
	}

	private final class MyOnScrollListener implements OnScrollListener {
		// 加载的总页数
		private int countPage = 5;
		// 每页加载20条数据
		private int pageSize = 20;

		// 滚动状态发生改变时
		public void onScrollStateChanged(AbsListView view, int scrollState) {
			Log.i("i", " scrollState " + scrollState);
		}

		// 当list开始滚动时
		public void onScroll(AbsListView view, int firstVisibleItem,
				int visibleItemCount, int totalItemCount) {
			// 最下面的条目数
			final int totalCount = firstVisibleItem + visibleItemCount;
			int currentPage = totalCount / pageSize;// 当前页
			int nextPage = currentPage + 1;// 下一页
			// 当翻到最后一条数据时
			if (totalCount == totalItemCount && nextPage <= countPage && finish) {
				// 已经移动到了listview的最后
				finish = false;
				// 添加页脚
				listview.addFooterView(footer);
				new Thread() {
					public void run() {
						SystemClock.sleep(3000);
						List<String> result = service.getData(totalCount + 1,
								pageSize);
						Message msg = new Message();
						msg.what = SUCCESS_GET_DATA;
						msg.obj = result;
						mHandler.sendMessage(msg);
					};
				}.start();
			}
		}
	}
}

数据服务类,这里进行数据的模拟获取

public class DataService {

	//加载数据
	public List<String> getData(int startPosition ,int offset){
		List<String> data = new ArrayList<String>();
		for(int i = 0;i< 20;i++){
			data.add("分页加载的数据   " + i);
		}
		return data;
	}
}


【Android进阶】Listview分页加载数据的实现的更多相关文章

  1. Android中ListView分页加载数据

    public class MainActivity extends Activity { private ListView listView=null; //listview的数据填充器 privat ...

  2. java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单

    一.widget:桌面小控件1 写一个类extends AppWidgetProvider 2 在清单文件件中注册: <receiver android:name=".ExampleA ...

  3. listView 分页加载数据

    Android应用 开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页 的形式来展示数据,个人觉得这样会有 ...

  4. Android中ListView动态加载数据

    1. 引言: 为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的 ...

  5. Android中ListView异步加载数据

    1.主Activity public class MainActivity extends Activity { private ListView listView; private ArrayLis ...

  6. Android之ListView&amp;Json加载网络数据

    使用到的主要内容: 1.Json 解析网络数据 2.异步任务加载图片和数据 3.ListView 的内存空间优化(ConvertView)和运行时间优化(ViewHolder) 4.ListView ...

  7. Android的ListView异步加载图片时,错位、重复、闪烁问题的分析及解决方法

    Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图 ...

  8. AppCan学习笔记----关闭页面listview动态加载数据

    AppCan页面关闭 AppCan 的页面是由两个HTML组成,如果要完全关闭的话需要在主HTML eg.index.html中关闭,关闭方法:appcan.window.close(-1); 管道 ...

  9. wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...

随机推荐

  1. Entity Framework 6 Recipes 2nd Edition(9-5)译-&gt;删除一个断开的实体

    9-5. 删除一个断开的实体 问题 我们要把一个把WCF上取回的对象做上删除的标志. 解决方案 假设我们有如Figure 9-5所示实体的支付与票据的模型. Figure 9-5. 一个支付与票据的模 ...

  2. Three.js + HTML5 Audio API 打造3D音乐频谱,Let’s ROCK!

    继续玩味之前写的音乐频谱作品,将原来在Canvas标签上的 作图利用Three.js让它通过WebGL呈现,这样就打造出了一个全立体感的频谱效果了. 项目详情及源码 项目GitHub地址:https: ...

  3. Mysqli封装

    <?php //headerheader('content-type:text/html;charset=UTF-8'); class DB {    //定义属性    private $ho ...

  4. JAVA Arrays.binarySearch

    转自:http://blog.csdn.net/somebodydie/article/details/8229343 package com.jaky; import java.util.*; pu ...

  5. 什么是SCADA Viewer

    SCADA Viewer 什么是SCADA Viewer SCADA Viewer是一个基于Web的软件框架(基于Web的HMI/SCADA/M2M工业和楼宇自动化,支持Modbus,BACnet,O ...

  6. Win10添加简体中文美式键盘的方法

    在Win10中很多朋友发现没有简体中文(美式键盘)的选项,而如果使用“英语-美式键盘”作为默认输入法,有ModernApp的界面会变成英文,这十分不方便,那么有没有方可以在Win10中添加一个 简体中 ...

  7. adb 服务端口2037被占,导致adb和appium无法工作

    症状1: 命令行运行 adb 相关命令,提示如下: adb server is out of date. killing...ADB server didn't ACK* failed to star ...

  8. Robots on a grid(DP+bfs())

    链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=25585 Current Server Time: 2013-08-27 20:42:26 Ro ...

  9. 洛谷 P1886 滑动窗口

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  10. ES 父子文档查询

    父子文档的特点 1. 父/子文档是完全独立的. 2. 父文档更新不会影响子文档. 3. 子文档更新不会影响父文档或者其它子文档. 父子文档的映射与索引 1. 父子关系 type 的建立必须在索引新建或 ...