一、功能分析----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. poj1459

    初涉网络流.改日再写一些概念性的介绍. ek算法可作为模板使用. #include <iostream> #include <queue> using namespace st ...

  2. 初识FreeMarker

    一.什么是FreeMarker? FreeMarker基于设计者和程序员是具有不同专业技能的不同个体的观念 他们是分工劳动的:设计者专注于表示——创建HTML文件.图片.Web页面的其它可视化方面: ...

  3. sgu - 274 - Spam-filter

    题意:判断一个字符串是不是有效的邮件地址. 题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=274 ——>>照着题目做. ...

  4. 超级终端和SecureCRT进行Console口的连接

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  5. MEF 编程指南(十二):批量组合

    MEF 容器实例并非不可变的.如果目录支持改变(像监控目录变动)或者在运行时添加/移除部件都可能发生改变.以前,你不得不做出改动并且调用 CompositionContainer 上的 Compose ...

  6. java笔记-关于一些常用 且实用的开源包

    作为一只从.net转java的程序猿..表示有些jdk原生的类很不习惯.. 1.时间处理 代替原生Calendar   joda-time 框架.地址https://github.com/JodaOr ...

  7. 关于Android与pc通信时中文乱码的分析和解决

    初步实现了Android与pc服务器的通信之后,又碰到了传说中令人头疼不已的中文乱码问题.既然出现了乱码,那么原因自然是协议不通了.我们知道eclipse中默认的编码标准是GBK,而安卓程序开发所默认 ...

  8. IOS学习之IOS沙盒(sandbox)机制和文件操作

    IOS学习之IOS沙盒(sandbox)机制和文件操作(一) 1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都 ...

  9. JUnit---Java单元测试必备工具

      在我们每天业务代码都写不完,为什么还要写测试代码呢,项目完成之后我再测不行吗? 看起来像是增加了代码量,但是它恰恰帮你减少了后期测试排错的时间,每个team,每个人都是有Bug指标的,首先,每次你 ...

  10. 利用PHP生成二维码(转)

    导读:在二维码广泛应用化的今天,在web站点中自动生成对应的二维码是最基础的需求.文章介绍了使用PHP自动生成二维码的三种方式. get方法实现方式一: $urlToEncode="163. ...