http://bbs.51cto.com/thread-968277-1.html

又是新的一周的开始,上午自己写了上拉加载更多数据的demo,嘿嘿这里和大家分享。
   android开发中,listview是最常用的控件之一,通常我们可以再微博、微信等很多应用里面都可以看到下拉刷新,以及上拉刷新,点击查看更多等功能。这里介绍下说下上拉刷新。
  上拉刷新其实和底部的“点击加载更多”的功能差不多。都是分页加载数据的一个实现。具体是去监听滚动条事件,下拉到底部时进行操作。
这里直接上代码

复制内容到剪贴板

代码:

package com.xzw.demo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class MainActivity extends Activity implements OnScrollListener {
        
        private static final String TAG = "MainActivity";
        
        private ListView listView;
        private View moreView; //加载更多页面
        
        private SimpleAdapter adapter;
        private ArrayList<HashMap<String, String>> listData;
        
        private int lastItem;
    private int count;
     
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        listView = (ListView)findViewById(R.id.listView);
        moreView = getLayoutInflater().inflate(R.layout.load, null);
        listData = new ArrayList<HashMap<String,String>>();
        
        prepareData(); //准备数据
        count = listData.size();
     
        adapter = new SimpleAdapter(this, listData,R.layout.item, 
                        new String[]{"itemText"}, new int[]{R.id.itemText});
        
        listView.addFooterView(moreView); //添加底部view,一定要在setAdapter之前添加,否则会报错。
        
        listView.setAdapter(adapter); //设置adapter
        listView.setOnScrollListener(this); //设置listview的滚动事件
    }

private void prepareData(){  //准备数据
            for(int i=0;i<10;i++){
                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put("itemText", "测试数据"+i);
                    listData.add(map);
            }
            
    }
    
    private void loadMoreData(){ //加载更多数据
             count = adapter.getCount(); 
            for(int i=count;i<count+5;i++){
                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put("itemText", "测试数据"+i);
                    listData.add(map);
            }
            count = listData.size();
    }

@Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                        int visibleItemCount, int totalItemCount) {
                
                Log.i(TAG, "firstVisibleItem="+firstVisibleItem+"\nvisibleItemCount="+
                                visibleItemCount+"\ntotalItemCount"+totalItemCount);
                
                lastItem = firstVisibleItem + visibleItemCount - 1;  //减1是因为上面加了个addFooterView
                
        }

@Override
        public void onScrollStateChanged(AbsListView view, int scrollState) { 
                Log.i(TAG, "scrollState="+scrollState);
                //下拉到空闲是,且最后一个item的数等于数据的总数时,进行更新
                if(lastItem == count  && scrollState == this.SCROLL_STATE_IDLE){ 
                        Log.i(TAG, "拉到最底部");
                        moreView.setVisibility(view.VISIBLE);
                 
                    mHandler.sendEmptyMessage(0);
                         
                }
                
        }
        //声明Handler
        private Handler mHandler = new Handler(){
                public void handleMessage(android.os.Message msg) {
                        switch (msg.what) {
                        case 0:
                             
                                try {
                                        Thread.sleep(3000);
                                } catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                            loadMoreData();  //加载更多数据,这里可以使用异步加载
                            adapter.notifyDataSetChanged();
                            moreView.setVisibility(View.GONE); 
                            
                            if(count > 30){
                                    Toast.makeText(MainActivity.this, "木有更多数据!", 3000).show();
                                  listView.removeFooterView(moreView); //移除底部视图
                            }
                                Log.i(TAG, "加载更多数据");
                                break;
            case 1:
                                
                                break;
                        default:
                                break;
                        }
                };
        };
    
}

以上就是核心的代码,下载:  listdemo.zip (689.73 KB) 。
效果图:
     

具体就是这样了,很简单吧。
    能力有限,请大家多多指教。一起交流学习。

listvew加载更多的更多相关文章

  1. listview下拉刷新和上拉加载更多的多种实现方案

    listview经常结合下来刷新和上拉加载更多使用,本文总结了三种常用到的方案分别作出说明. 方案一:添加头布局和脚布局        android系统为listview提供了addfootview ...

  2. 分页插件思想:pc加载更多功能和移动端下拉刷新加载数据

    感觉一个人玩lol也没意思了,玩会手机,看到这个下拉刷新功能就写了这个demo! 这个demo写的比较随意,咱不能当做插件使用,基本思想是没问题的,要用就自己封装吧! 直接上代码分析下吧! 布局: & ...

  3. 移动端下拉刷新、加载更多插件dropload.js(基于jQuery/Zepto)[转]

    使用方法 引用css和js <link rel="stylesheet" href="../dist/dropload.min.css"> < ...

  4. 原生js移动端touch事件实现上拉加载更多

    大家都知道jQuery里没有touch事件,所以在移动端使用原生js实现上拉加载效果还是很不错的,闲话不多说,代码如下: //获取要操作的元素 var objSection = document.ge ...

  5. 基于zepto的H5/移动端tab切换触摸拖动加载更多数据

    以前实现移动端的滑动加载更多实现的方法是当滚动条快到页面底部时就自动加载更多的数据,在这方面很多人都用的是"西门的后花园"写的一个叫dropload的插件,这个插件用起来也很好,很 ...

  6. Android之Socket通信、List加载更多、Spinner下拉列表

    Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...

  7. H5基于iScroll实现下拉刷新,上拉加载更多

    前言 前一段有个手机端的项目需要用到下拉刷新和上拉加载更多的效果,脑海里第一反映就是微博那种效果,刚开始的理解有些偏差,以为下拉也是追加数据,上拉也是追加数据,后请教同事后发现其实下拉只是刷新最新数据 ...

  8. MVC中实现加载更多

    需要实现的功能: 数据太多想初次加载部分数据,在底部加上“加载更多”按钮 点击后加载第二页数据(从数据库只取指定页数据)后接在已有数据后面(类似于android中的下拉加载更多) 每次加载时显示“正在 ...

  9. 常见开发需求之angular上拉加载更多

    需求   移动端使用angular实现上拉加载更多的条目,这个需求比较常见,网上的插件改动起来比较麻烦,不如自己写一个最适合,以前有同事写了一个,奈何bug太多,后来改分页了,我们产品说什么都让做,没 ...

随机推荐

  1. printf输出函数

    printf函数称为格式输出函数 格式: printf(const char *_Format,...) printf(“格式控制字符串”, 输出表列)其中格式控制字符串用于指定输出格式.格式控制串可 ...

  2. Effective Java单元测试JUnit - 就是爱Java

    实作了RoleImpl class,现在要开始单元测试了,或许你会觉得奇怪,才刚做好一个class而已,它并没有商业规则,只有getter/setter与clone(),那是要测试什么呢?没错,传统上 ...

  3. SQLSERVER读懂语句运行的统计信息

    SQLSERVER读懂语句运行的统计信息 对于语句的运行,除了执行计划本身,还有一些其他因素要考虑,例如语句的编译时间.执行时间.做了多少次磁盘读等. 如果DBA能够把问题语句单独测试运行,可以在运行 ...

  4. 关于Redis的一些常识

    http://blog.csdn.net/mengxianhua/article/details/8961713 关于Redis的一些常识 2013-05-22 18:00 13315人阅读 评论(0 ...

  5. 用 Graphviz画神经网络图

    用 Graphviz . 以下代码提供一个例子, 具体使用时做简单修改即可. digraph G { rankdir=LR splines=line nodesep=.05; node [label= ...

  6. [Ubuntu]在Ubuntu下搭建自己的源服务器

    1.摘要     网上有很很多关于搭建源镜像的文章,但是对于一般人来讲,用不着镜像所有的deb包,只对我们能用到的感兴趣.另外,对于一些在Ubuntu的源中没有的软件,我们也可以放在我们自己的源里,这 ...

  7. UVA 10152-ShellSort(映射+栈)

    题意: 给出一堆乌龟名字,乌龟能从本身位置爬到顶端. 要求求出从原本的顺序到目标顺序的最小操作.输出每次操作移到顶端的乌龟的名字. 解析:名字用映射对应编号,把目标状态的乌龟从上到下的编号按1到N编好 ...

  8. 【LeetCode练习题】Maximum Depth of Binary Tree

    Maximum Depth of Binary Tree Given a binary tree, find its maximum depth. The maximum depth is the n ...

  9. structs 拦截器

    首先,要跟大家道个歉,前一阵子为给客户个一个DEMO,忙得不可开交,所以很久没有更新Blog.提到这个DEMO我想顺便跟大家分享一下心得——如果大家希望快速开发,一个类似Struts 2这样的简单方便 ...

  10. 【巧妙消维DP】【HDU2059】龟兔赛跑

    龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...