一、功能分析----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. hdu 4763 Theme Section(KMP水题)

    Theme Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  2. 介绍50个 WordPress 动作挂钩

    WordPress 之所以能成为世界上最受欢迎的网页内容管理系统,原因就在于它的高度灵活性和可塑性,而这种灵活性和可塑性正是由“挂钩”(Hooks)简洁宜用的结构所决定的.可以说,没有过滤挂钩(Fil ...

  3. list删除操作 java.util.ConcurrentModificationException

    首先大家先看一段代码: public static void main(String[] args) { List<String> listStr = new ArrayList<S ...

  4. Hash Table构建

    get-item e:\test\* |format-table @{name="aa";expression={$_.name.tostring().split(".& ...

  5. Klist

    显示当前缓存的 Kerberos 票证的列表. 有关如何使用此命令的示例 语法 klist [-<LogonId.HighPart> lh] [-li <LogonId.LowPar ...

  6. HDU 5510 Bazinga 暴力匹配加剪枝

    Bazinga Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5510 ...

  7. Codeforces Round #327 (Div. 2) B. Rebranding 水题

    B. Rebranding Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/591/problem ...

  8. HDU 3410 &amp;&amp; POJ 3776 Passing the Message 单调队列

    题意: 给定n长的数组(下标从1-n)(n个人的身高,身高各不同样 问:对于第i个人,他能看到的左边最矮的人下标.(假设这个最矮的人被挡住了,则这个值为0) 还有右边最高的人下标,同理若被挡住了则这个 ...

  9. iOS开发——网络编程Swift篇&(三)同步Get方式

    同步Get方式 // MARK: - 同步Get方式 func synchronousGet() { //创建NSURL对象 var url:NSURL! = NSURL(string: " ...

  10. 使用proguard混淆android代码

    当前是有些工具比方apktool,dextojar等是能够对我们android安装包进行反编译,获得源代码的.为了降低被别人破解,导致源代码泄露,程序被别人盗代替码,等等.我们须要对代码进行混淆,an ...