Android中ListView分页加载数据
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分页加载数据的更多相关文章
- Android中ListView动态加载数据
1. 引言: 为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的 ...
- Android中ListView异步加载数据
1.主Activity public class MainActivity extends Activity { private ListView listView; private ArrayLis ...
- 【Android进阶】Listview分页加载数据的实现
Listview分页加载数据的实现 public class MainActivity extends Activity { protected static final int SUCCESS_GE ...
- java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单
一.widget:桌面小控件1 写一个类extends AppWidgetProvider 2 在清单文件件中注册: <receiver android:name=".ExampleA ...
- Android中的分页加载
//----------------------MainActivity中--------------------------------------------------- package com ...
- listView 分页加载数据
Android应用 开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页 的形式来展示数据,个人觉得这样会有 ...
- Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案
我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...
- Android 自定义ListView动态加载数据
我们都知道网络取数据是耗时操作,如果我们一次性请求所有数据,假如数据量不多那还可以接受,但是如果数据量特别多,那么带来的后果就是用户的愤怒(用户是很没有耐心的),所以这时候我们就需要动态的加载数据,分 ...
- android 中使用缓存加载数据
最近app快完工了,但是很多列表加载,新闻咨询等数据一直从网络请求,速度很慢,影响用户体验,所以寻思用缓存来加载一些更新要求不太高的数据 废话不多说,上代码 欢迎转载,但请保留文章原始出处:) 博客 ...
随机推荐
- 很好用的Tab标签切换功能,延迟Tab切换。
一个网页,Tab标签的切换是常见的功能,但我发现很少有前端工程师在做该功能的时候,会为用户多想想,如果你觉得鼠标hover到标签上,然后切换到相应的内容,就那么简单的话,你将是一个不合格的前端工程师啊 ...
- Android Service初步学习的笔记
1.Service的应用场景 条件:a.并不依赖于用户可视化界面(不是绝对的,如前台service就是与notification界面结合使用的) b.具有较长时间的运行特性. service的应用 ...
- c# 为什么要用 get set 属性
1 可以对赋值 做验证 ,范伟限制,额外的限制 2 可以设置 只读 只写 3 可以做线程同步 4 可以将属性设置在interface接口中 5 可以使用虚属性 或 抽象属性 可以填补 没有 虚字段 抽 ...
- >/dev/null 2>&1 这句话的含义
1表示标准输出,2表示标准错误输出 2>&1表示将标准错误输出重定向到标准输出,这样,程序或者命令的正常输出和错误输出就可以在标准输出输出(也就是一起输出). 一般来讲标准输出和标准错误 ...
- Android学习笔记(广播机制)
1.Android的广播机制介绍 收听收音机也是一种广播,在收音机中有很多个广播电台,每个广播电台播放的内容都不相同.接受广播时广播(发送方)并不在意我们(接收方)接收到广播时如何处理.好比我们收听交 ...
- 【转】 iOS开发UI篇—UIScrollView控件实现图片轮播
原文:http://www.cnblogs.com/wendingding/p/3763527.html iOS开发UI篇—UIScrollView控件实现图片轮播 一.实现效果 实现图片的自动轮播 ...
- C#操作数据库,将其查查出来的记录条数显示在winform窗体中的方法之一
//1.数据库链接的基本操作(略) //2.创建对象函数(关键部分) sqlConn.Open(); //初始化定义记录条数 ; object obj = sqlComm.ExecuteScalar( ...
- Java GC 日志输出分析
搜到的几篇讲GC日志的文章,学到了很多东西.但是有些错误或者不够精确的地方. 因此自己尝试着总结一下. 先写个程序,然后结合程序解释每句话的意思. 运行参数 -Xms200M -Xmx200M -Xm ...
- php实现返回上一页的功能的3种有效方法
php实现返回上一页的功能的3种有效方法 header(location:你的上一页的路径); // 注意这个函数前不能有输出 header(location:.getenv("HT ...
- XAMPP配置虚拟主机
当你在本地进行单个网站建设和测试的时候,你只需要正常的安装一下XAMPP就好了.XAMPP本身是集成了apache.mysql和php的.然而当你本地测试站点一多的话,你就不得不考虑使用多个虚拟主机来 ...