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 中使用缓存加载数据

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

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

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

随机推荐

  1. 关于PHP的curl开启问题

    今天在做一个新浪登录功能,新浪提供的PHP SDK里需要用到curl_init()函数,在调试的时候报找不到curl_init()的方法. 经搜索得知需要开启curl的php扩展,那curl又是什么呢 ...

  2. iOS从App跳转至系统设置菜单各功能项的编写方法讲解

    跳到系统设置里的WiFi界面 info里面设置: 在项目中的info.plist中添加 URL types 并设置一项URL Schemes为prefs,如下图 代码: 复制代码 代码如下: NSUR ...

  3. SQL脚本循环修改数据库字段类型

    数据库在设计的时候也许考虑不全面,导致某些字段类型不太准确.比如设计的时候是varchar(1024),但是实际使用的时候却发现太小了,装不下,于是需要修改字段类型为ntext什么的. 我最近就遇到了 ...

  4. navicat从下载到使用

    ☆准备工作 确保电脑安装了mysql数据库 确定my.ini下的字符集设置为utf8 ☆下载navicat 输入网址 https://www.navicat.com 点击Downloads 点击Dow ...

  5. TXT导入出现乱码

    错误#1 11:15 2012-12-19客户提供一txt文本文件,要求导入到数据库,选用dts导入工具,选择数据源步骤如下列预览时出现乱码解答#1 双击打开原始文件中文显示正常,将其另存为选择编码为 ...

  6. 戴文的Linux内核专题:08内核配置(5)

    转自Linux中国 Linux内核拥有许多可以配置的特性,接下来我们还有许多要配置. 下一个可以配置的特性是x86的随机数生成器(x86 architectural random number gen ...

  7. samba 服务

    samba-client-3.6.9-167.el6_5.i686 samba-3.6.9-167.el6_5.i686 samba-common-3.6.9-167.el6_5.i686 samba ...

  8. Java学习笔记(八):集合类

    Java中对数据的存储会使用到集合类,下面我们来看看Java中常用的集合类. Collection接口 集合的接口,可以简单的理解为可以动态扩充的数组. Collection接口定义了很多相关的方法, ...

  9. jni数据问题

    目的: jni中(c++函数)一个 char buf[4] 如何通过env->CallVoidMethod(clazz,method_OnFindCards,jStringParam); 在ap ...

  10. 基于XMPP协议的aSmack源码分析

    在研究如何实现Pushing功能期间,收集了很多关于Pushing的资料,其中有一个androidnp开源项目用的人比较多,但是由于长时间没有什么人去维护,听说bug的几率挺多的,为了以后自己的产品稳 ...