一、功能分析----ListView“加载更多”,功能如下图所示:

这个效果是当你上拉拖动页面时(注意有区别于下拉刷新),页面提示正在加载,2秒后显示留言更多内容;具体功能知道那我就来讲解下如何实现这个功能。

二、创建自定义ListView及其底部布局footer

首先做一个加载提示布局,布局footer_layout如下图

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/load_layout"
    android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_gravity="center" >
        <ProgressBar
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           style="?android:attr/progressBarStyleSmall"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="正在加载..." />
</LinearLayout>

将布局添加至ListView,自定义一个ListView

package com.mg.message.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import com.mg.message.R;

public class LX_LoadListView extends ListView implements OnScrollListener{
    View footer;//底部布局
    int totalItemCount;//总数量
    int lastVisibleItem;//最后一个可见的Item
    boolean isLoading;//正在加载
    ILoadListener iLoadListener;
    public LX_LoadListView(Context context) {
        super(context);
        initView(context);
    }
   
    public LX_LoadListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }
   
    public LX_LoadListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initView(context);
    }
/**
* 添加底部加载提示布局到listview
* @param context
*/
    private void initView(Context context) {
        LayoutInflater layoutInflater=LayoutInflater.from(context);
        footer=layoutInflater.inflate(R.layout.lx_footer_layout, null);
        footer.findViewById(R.id.load_layout).setVisibility(View.GONE);
        this.addFooterView(footer);
        this.setOnScrollListener(this);
    }

@Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
    {
        this.lastVisibleItem=firstVisibleItem+visibleItemCount;
        this.totalItemCount=totalItemCount;
    }

@Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if (totalItemCount==lastVisibleItem&&scrollState==SCROLL_STATE_IDLE) {
            if (!isLoading) {
                isLoading=true;
                footer.findViewById(R.id.load_layout).setVisibility(View.VISIBLE);
                iLoadListener.onLoad();//加载更多数据
            }
        }
    }
    //加载完毕
    public void loadComplete() {
        isLoading=false;
        footer.findViewById(R.id.load_layout).setVisibility(View.GONE);
    }
    public void setInterface(ILoadListener iLoadListener) {
        this.iLoadListener=iLoadListener;
    }
    //加载更多数据的回调接口
    public interface ILoadListener
    {
        public void onLoad();
    }
}

三、给ListView设置Adapter并实现接口中的Load方法

①自定义ListView布局,lx_get_content_activity

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_marginTop="2dp"
    android:layout_marginBottom="2dp"
    android:layout_marginLeft="2dp"
    android:layout_marginRight="2dp"
    android:background="@drawable/edit_normal">
    <com.mg.message.view.LX_LoadListView
        android:id="@+id/list_content"
        android:layout_width="match_parent"
        android:background="@drawable/edit_normal"
        android:layout_height="0dip"
        android:focusable="true"
        android:layout_weight="1.20" >
    </com.mg.message.view.LX_LoadListView>
</LinearLayout>

②给ListView设置Adapter,并实现接口的Load方法

package com.mg.message.ui;

import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.AdapterView.OnItemClickListener;
import com.mg.core.base.BaseActivity;
import com.mg.core.net.OperateCode;
import com.mg.core.net.ThreadMessage;
import com.mg.message.R;
import com.mg.message.data.GetMessageData;
import com.mg.message.domain.Message;
import com.mg.message.ui.adapter.ContentAdapter;
import com.mg.message.utils.ViewUtil;
import com.mg.message.view.LX_LoadListView;
import com.mg.message.view.LX_LoadListView.ILoadListener;
/* * 获得留言*/
public class LX_GetContentActivity extends BaseActivity implements ILoadListener
{
    private LX_LoadListView listView;
    private List<Message> totalMessages=new ArrayList<Message>();
    private static ContentAdapter myAdapter;
    private int totalSize;
    List<Message> messages=new ArrayList<Message>();
    @Override
    protected void initEvents()
    {
        listView.setOnItemClickListener(new OnItemClickListener() //进入删除页
        {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                    long arg3)
            {
                Bundle bundle = new Bundle(); //传递多参数时使用Bundle
                bundle.putString("ID", messages.get(position).getID());
                bundle.putString("UContent", messages.get(position).getContent().toString());
                bundle.putString("UTime", messages.get(position).getCreateTime());
                   startCOActivity(LX_DeleteActivity.class,bundle);
                   finish();
            }
        });
        //修改留言
        listView.setOnItemLongClickListener(new OnItemLongClickListener()
        {
            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                    int position, long arg3) {
                Bundle bundle = new Bundle(); //传递多参数时使用Bundle
                bundle.putString("ID", messages.get(position).getID());
                   startCOActivity(LX_AddMessageActivity.class,bundle);
                   finish();
                return false;
            }
        });
    }

@Override
    protected void initViews()
    {
        setContentView(R.layout.lx_get_content_activity);
        mTopBar.setVisibility(View.VISIBLE);
        mTopBar.SetTvName("查看留言");
        listView=(LX_LoadListView)findViewById(R.id.list_content);
        listView.setInterface(this);
          myAdapter=new ContentAdapter(messages);
          listView.setAdapter(myAdapter);

    }
    @Override
    protected void onResume() {
        super.onResume();
        showToast("onResume", false);
        sendToBackgroud(OperateCode.i_getMessageInfo);
    }
    @Override
    protected void receiveRequest(ThreadMessage threadMessage)
    {
        hideProgressDialog();
        OperateCode operateCode = threadMessage.getOperateCode();
        List<Message> messageList;
        switch (operateCode)
        {  //查看留言
            case i_getMessageInfo:
                messageList=GetMessageData.getMessagesList();
                if(ViewUtil.isNotEmpty(messageList))
                {
                    totalMessages.clear();
                    messages.clear();
                    totalMessages.addAll(messageList);
                    totalSize=totalMessages.size();
                    getData();
                    myAdapter.notifyDataSetChanged();
                }
                break;
            default:
                break;
        }
    }
    //listview初始化条数
    private void  getData()
    {
        try {
            if (totalSize<9) {
                messages.addAll(GetMessageData.getMessagesList());
                showToast("留言小于9加载完毕", false);
            }
            else {
                messages.addAll(GetMessageData.getMessagesList().subList(0, 8));
            }
        }
        catch (Exception e) {
        }
    }
    //加载数据
    private void getLoadData()
    {
        int lastsize=totalSize-messages.size();
        if(messages.size()<totalSize)
        {
            if (lastsize<5) {
                messages.clear();
                messages.addAll(GetMessageData.getMessagesList());
                showToast("加载项<5加载完毕", false);
            }
            else {
                messages.addAll(totalMessages.subList(messages.size(), messages.size()+5));
            }
        }       
        else
        {
            messages.clear();
            messages.addAll(GetMessageData.getMessagesList());
            showToast("全部加载完毕", false);
        }
        myAdapter.notifyDataSetChanged();
    }
    @Override
    public void onLoad()
    {
        android.os.Handler handler=new android.os.Handler();
        handler.postDelayed(new Runnable()
        {
            @Override
            public void run() {
                getLoadData();//获取更多数据
                listView.loadComplete();//通知listview加载完毕
            }
        }, 2000);
    }
}

Android的ListView分页功能的更多相关文章

  1. Android的ListView分页功能(上滑加载更多)

    今天主要工作是将之前实现的各种ListView显示全部信息,优化成了每次加载几条数据,然后上滑的时候加载更多,底部显示一个进度条和一个文字提示,然后加载完毕后,将提示信息隐藏. 一边看教学视频一遍敲代 ...

  2. 转--Android实现ListView过滤功能,继承于BaseAdapter,非ArrayAdapter。

    其实实现ListView过滤功能最方便的便是使用ArrayAdapter,里面自带的getFilter()方法能很方便的实现此功能,但是在实际的开发中,一般都是继承于BaseAdapter.还有一种是 ...

  3. Android中ListView分页加载数据

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

  4. android中listview分页载入数据

    前段时间做的新浪微博项目一直想实现listview分页载入数据,今天最终实现了,哈哈!感觉挺好的,今天又写了个demo给大家分享下. 首先说下listview的优化方案,这也是面试中常考的题目.优化方 ...

  5. Android之ListView分页数据加载

    1.效果如下: 实例如下:  上图的添加数据按钮可以换成一个进度条  因为没有数据所以我加了一个按钮添加到数据库用于测试:一般在服务器拉去数据需要一定的时间,所以可以弄个进度条来提示用户: 点击加载按 ...

  6. Android学习随笔--ListView的分页功能

    第一次写博客,可能格式,排版什么的会非常不美观,不过我主要是为了记录自己的Android学习之路,为了以后能有些东西回顾.既然是为了学习,那我肯定会吸收各位大大们的知道经验,有不足的地方请指出. 通过 ...

  7. Android开发ListView使用OnScrollListener实现分页加载数据

    上篇博文和大家分享了下拉刷新,这是一个用户体验很好的操作方式.新浪微薄就是使用这样的方式的典型. 还有个问题,当用户从网络上读取微薄的时候.假设一下子所有载入用户未读的微薄这将耗费比較长的时间,造成不 ...

  8. Android ListView分页载入(服务端+android端)Demo

    Android ListView分页载入功能 在实际开发中经经常使用到,是每一个开发人员必须掌握的内容,本Demo给出了服务端+Android端的两者的代码,并成功通过了測试. 服务端使用MyEcli ...

  9. Android --ListView分页

    参考博客:Android ListView分页加载(服务端+android端)Demo 监听OnScrollListener事件 class OnListScrollListener implemen ...

随机推荐

  1. python crawler0723.py

    #!/usr/env  python #-*- coding: utf-8  -*- import urllib import urllib2 import random import request ...

  2. XML操作:2.LINQ TO XML(http://www.cnblogs.com/AlexLiu/archive/2008/10/27/linq.html)

    LINQ to XML 建立,读取,增,删,改   LINQ to XML的出现使得我们再也不需要使用XMLDocument这样复杂的一个个的没有层次感的添加和删除.LINQ可以使的生成的XML文档在 ...

  3. C++中用二维数组传参时形参该怎样写[转]

    二维数组的存储方式是和一维数组没什么区别,但是用二维数组做参数,它的形参该怎样写? 要注意的是:函数中的形参其实就相当于一个声明,并不产生内存分配,形参的目的就是要让编译器知道函数参数的数据类型. 正 ...

  4. Installation Directory must be on a local hard drive解决办法

    今天带着公司的电脑来杭州这边,同事发来一个Sliksubversion.msi来进行安装,由于系统是win8.1的,直接点击安装不了,真的是醉了,于是乎发挥度娘的力量找到了答案,这里贴出来,供大家来参 ...

  5. 在Android Eclipse 开发如何 使用 (*.aar)文件

    http://www.cnblogs.com/shortboy/p/4424944.html 开场白:其实这篇文章有点白费心机. 详细说明是:http://blog.csdn.net/qiujuer/ ...

  6. Codeforces Round #329 (Div. 2) D. Happy Tree Party 树链剖分

    D. Happy Tree Party Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/593/p ...

  7. uoj #31. 【UR #2】猪猪侠再战括号序列 贪心

    #31. [UR #2]猪猪侠再战括号序列 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/31 Descript ...

  8. Android传感器编程带实例

    看了程序人生 网站的 编程高手的编程感悟 深有感触,好像也是一个android 程序员写的,推荐大家也看看.话不多说,还是言归正传吧. 一.前言 我很喜欢电脑,可是笔记本还是太大,笔记本电脑再小还是要 ...

  9. 苹果开发工具:Xcode和Interface Builder

    摘要:在Mac OS X上开发,首选Xcode继承开发环境.本文对开发工具套件中最重要的Xcode和Interface Builder两个工具做了简要介绍,并提供<苹果开发工具概述>PDF ...

  10. json对象,使用 “ . ”获取值是,不能使用变量作为属性名。

    var he={'aa':"aa",'bb':'bb'}; var chun={'cc':"aa",'dd':'mm'}; c=he.aa; n=chun.c; ...