public class MainActivity extends Activity {

    private ListView listView=null;

    //listview的数据填充器
private ArrayAdapter<String> adapter;
//listview中数据的集合
private List<String> data;
//下一页初始化为0
int nextpage = 0;
//每一页记载多少数据
private int number=10;
//最多有几页
private int maxpage=5;
//用来判断是否加载完成
private boolean loadfinish=true;
private View v;
private Handler handler;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//listview中脚跟的视图
v=this.getLayoutInflater().inflate(R.layout.progress, null);
listView=(ListView) super.findViewById(R.id.listview);
//得到数据
data=DataServer.getData(0,10);
//实习化ArrayAdapter对象
adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, data);
//添加listview的脚跟视图,这个方法必须在listview.setAdapter()方法之前,否则无法显示视图
listView.addFooterView(v);
//添加数据
listView.setAdapter(adapter);
//当下一页的数据加载完成之后移除改视图
listView.removeFooterView(v);
//当用户滑动listview到最后一项是,动态的加载第二页的数据
listView.setOnScrollListener(new OnScrollListener()
{
public void onScrollStateChanged(AbsListView view, int scrollState)
{
// TODO Auto-generated method stub
} @Override
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, final int totalItemCount)
{ //得到listview最后一项的id
int lastItemId=listView.getLastVisiblePosition();
//判断用户是否滑动到最后一项,因为索引值从零开始所以要加上1
if((lastItemId+1)==totalItemCount)
{
/**
* 计算当前页,因为每一页只加载十条数据,所以总共加载的数据除以每一页的数据的个数
* 如果余数为零则当前页为currentPage=totalItemCount/number;
* 如果不能整除则当前页为(int)(totalItemCount/number)+1;
* 下一页则是当前页加1
*/
int currentPage=totalItemCount%number;
if(currentPage==0)
{
currentPage=totalItemCount/number;
}
else
{
currentPage=(int)(totalItemCount/number)+1;
}
System.out.println("当前页为:"+currentPage);
nextpage=currentPage+1;
//当总共的数据大于0是才加载数据
if(totalItemCount>0)
{
//判断当前页是否超过最大页,以及上一页的数据是否加载完成
if(nextpage<=maxpage && loadfinish )
{
//添加页脚视图
listView.addFooterView(v); loadfinish=false;
new Thread(new Runnable()
{
public void run()
{
try { Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获取当前加载页的数据
data=DataServer.getData(totalItemCount, 10);
//通知listview改变UI中的数据
handler.sendEmptyMessage(0);
}
}).start();
//还可以通过这样的方式实现
//AsyncTaskLoadData asynctask=new AsyncTaskLoadData(totalItemCount);
///asynctask.execute();
}
} }
//判断加载的数据的页数有没有超过最大页,并且是否已经记载完成 }
}); handler=new Handler()
{
@SuppressLint("HandlerLeak")
public void handleMessage(Message msg)
{
if(msg.what==0)
{
//通知listview中的数据已经改动
adapter.notifyDataSetChanged();
loadfinish=true;
}
super.handleMessage(msg);
//判断listview中的页脚视图是否存在,如果存在在删除页脚视图
if(listView.getFooterViewsCount()!=0)
{
listView.removeFooterView(v);
}
}
}; } //异步加载数据
@SuppressWarnings("unused")
private final class AsyncTaskLoadData extends AsyncTask<Object, Object, Object>
{
private int count;
private List<String> list;
public AsyncTaskLoadData(int totalItemCount) {
this.count=totalItemCount;
list=new ArrayList<String>();
} protected Object doInBackground(Object... params) {
list=DataServer.getData(count, 10);
return null;
} @Override
protected void onPostExecute(Object result)
{
try {
data=list; adapter.notifyDataSetChanged();
Thread.sleep(2000);
loadfinish=true;
if(listView.getFooterViewsCount()!=0)
{
listView.removeFooterView(v);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.onPostExecute(result);
} } }

数据提供类

 public class DataServer
{
private static List<String> data=new ArrayList<String>();
public static List<String> getData(int offset, int maxnumber)
{
for(int i=0;i<maxnumber;i++)
{
data.add("Listview分页加载数据"+"item"+i);
}
return data;
}
}

运行效果:

Android中ListView分页加载数据的更多相关文章

  1. Android中ListView动态加载数据

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

  2. Android中ListView异步加载数据

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

  3. 【Android进阶】Listview分页加载数据的实现

    Listview分页加载数据的实现 public class MainActivity extends Activity { protected static final int SUCCESS_GE ...

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

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

  5. Android中的分页加载

    //----------------------MainActivity中--------------------------------------------------- package com ...

  6. listView 分页加载数据

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

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

    我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...

  8. Android 自定义ListView动态加载数据

    我们都知道网络取数据是耗时操作,如果我们一次性请求所有数据,假如数据量不多那还可以接受,但是如果数据量特别多,那么带来的后果就是用户的愤怒(用户是很没有耐心的),所以这时候我们就需要动态的加载数据,分 ...

  9. android 中使用缓存加载数据

    最近app快完工了,但是很多列表加载,新闻咨询等数据一直从网络请求,速度很慢,影响用户体验,所以寻思用缓存来加载一些更新要求不太高的数据 废话不多说,上代码 欢迎转载,但请保留文章原始出处:)  博客 ...

随机推荐

  1. javascript权威指南第6版学习笔记

    javascript权威指南第6版学习笔记 javascript数组.函数是特殊对象 看一点少一点. 3.1.4 hello.js内容是 var x=.3-.2;var y=.2-.1 console ...

  2. Android- Activity not found

    今天调试代码的时候,出现很奇怪的现象: \XX\bin\Home.apk installed on device. 一般来说即使已经装到设备中,也没有这个提示,况且更奇怪的是,程序并又有自动运行.查看 ...

  3. (转载)[FFmpeg]使用ffmpeg从各种视频文件中直接截取视频图片

    你曾想过从一个视频文件中提取图片吗?在Linux下就可以,在这个教程中我将使用ffmpeg来从视频中获取图片. 什么是ffmpeg?What is ffmpeg? ffmpeg是一个非常有用的命令行程 ...

  4. javascript事件详解1

    事件流讲解来袭,嘎嘎嘎嘎嘎 ---------------------------------------------------------------- 1.事件流:描述的是在页面中接受事件的顺序 ...

  5. ExtJs 第二章,Ext.form.Basic表单操作

    1.认识Ext.form.Panel表单面板         Ext.form.field.CheckBox 复选框 checkboxfield Ext.form.CheckBoxGroup 复选框组 ...

  6. centos中文乱码修改字符编码使用centos支持中文

    如何你的centos显示中文乱码,只要修改字符编码使centos支持中文就可以了,没有这个文件可以创建它,下面是修改步骤 一.中文支持 安装中文语言包: 复制代码 代码如下: yum groupins ...

  7. ios开发之IBOutlet和IBAction的区别

    IBOutlet 输出口是使用关键字IBOutlet声明的实例变量.控制器头文件中的输出口声明应如下所示: @property (nonatomic, retain) IBOutlet UIButto ...

  8. TabControl控件中TabPage的显示和隐藏

    TabPage里面含有方法Hide和Show,但没有任何作用,实际隐藏和显示需要使用如下2个方法 方法一:此方法比较简单 TabPageServo.Parent = Nothing   //隐藏 Ta ...

  9. Grnymotion模拟器和Android真机访问PC端Tomcat下的应用

    最近因为要学安卓与服务器交互的知识,所以必须要让android程序能访问一个测试服务器.所以我就考虑让真机或者模拟器访问PC端的Tomcat或者Apache服务. 在介绍步骤之前,有必要说点基础的.我 ...

  10. php基础知识【函数】(6)mysql数据库

    一.连接和关闭 1.mysql_connect('example.com:3307', 'root', '123456') --打开一个到 MySQL 服务器的非永久连接 2.mysql_pconne ...