Android自定义ListView(二) - 可上拉加载的ListView(即具有分页功能的ListView)

在我的上一篇博客中(大家感兴趣的可以看一下我的上一篇博客Android自定义ListView(一) - 可下拉刷新的ListView),与大家一起分享了可下拉刷新的ListView,原理还是很简单的,今天与大家一起分享可上拉加载的ListView(即具有分页功能的ListView),我个人感觉这个可上拉加载的ListView,其实现起来比下拉刷新的ListView更加简单,相信如果你已经掌握的可下拉刷新的ListView,实现可上拉加载的ListView不具有任务困难。

        首先说明一下,这里实现的可上拉加载的ListView是在在上一个可下拉刷新的ListView的工程里完成的,只是我单独新建了一个ListView-------LoadListView,为了简化代码,我并没有集成到上一篇博客中完成的PullToRefreshListView,如果读者感兴趣,可以自已集成一 个既可下拉刷新,又可上拉加载的ListView,下一步,我也会将这两部分合并。

好了,先看一下效果图:

        



        下面粘上主要的代码:

        

        

package com.ssa.pulltorefreshlistview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.AbsListView.OnScrollListener;

;

public class LoadListView extends ListView implements OnScrollListener {
    private View mFooter;
    private int mTotalItemCount;
    private int mLastVisibleItem;
    private boolean isLoading;
    private ILoadListener mLoadListener;

    public LoadListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }

    /**
     * 添加底部布局
     * @param context
     */
    private void initView(Context context) {
        LayoutInflater inflater = LayoutInflater.from(context);
        mFooter = inflater.inflate(R.layout.footer_item, null);
        mFooter.findViewById(R.id.ll_container).setVisibility(View.GONE);
        this.addFooterView(mFooter);
        this.setOnScrollListener(this);
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        //当ListView最后一个Item的序号与ListView所有Item的数量相等,并且此时滚动状态处于闲置,空闲时,执行加载数据的逻辑
        if (mTotalItemCount == mLastVisibleItem && scrollState == SCROLL_STATE_IDLE) {
            if (!isLoading) {
                mFooter.findViewById(R.id.ll_container).setVisibility(View.VISIBLE);
                isLoading = true;
                //加载更多数据
                this.mLoadListener.onLoad();
            }
        }
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        //这里是上拉加载实现的关键,firstVisibleItem,为ListView可见的第一个Item的序号,visibleItemCount为可见Item的数量,
        //二者相加就是可见最后一个Item的序号,而totalItemCount是ListView所有的Item的数量。
        this.mLastVisibleItem = firstVisibleItem + visibleItemCount;
        this.mTotalItemCount = totalItemCount;
    }

    public void setLoadListener(ILoadListener listener) {
        this.mLoadListener = listener;
    }

    public void loadComplete() {
        mFooter.findViewById(R.id.ll_container).setVisibility(View.GONE);
        isLoading = false;
    }

    /**
     * 加载更多数据回调接口
     */
    public interface ILoadListener {
        void onLoad();
    }
}


下面是MainActivity1的代码,待会如果要下载代码运行看一下效果的朋友们请注意:MainActivity对应的是PullToRefreshListView,

  

  

package com.ssa.pulltorefreshlistview;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;

import com.ssa.pulltorefreshlistview.LoadListView.ILoadListener;

public class MainActivity1 extends Activity implements ILoadListener {
    private LoadListView mLoadListView;
    private ListViewAdapter mAdapter;
    private ArrayList<String> mDatas;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main1);
        initUI();
    }

    private void initUI() {
        mLoadListView = (LoadListView) findViewById(R.id.lv_refresh);
        mLoadListView.setLoadListener(this);
        mAdapter = new ListViewAdapter(this);
        mDatas = new ArrayList<String>();
        mAdapter.setDataSources(mDatas);
        mLoadListView.setAdapter(mAdapter);
        String str = getResources().getString(R.string.list_view_data);
        for (int i = 0; i < 30; i++) {
            mDatas.add(String.format(str, i));
        }
    }

    @Override
    public void onLoad() {
        Handler handler = new Handler();
        //模拟网络请求的延迟时间
        handler.postDelayed(new Runnable() {

            @Override
            public void run() {
                String str = getResources().getString(R.string.list_view_data_refresh);
                for (int i = 0; i < 2; i++) {
                    mDatas.add(mDatas.size(), String.format(str, i));
                }
                mAdapter.notifyDataSetChanged();
                mLoadListView.loadComplete();
            }
        }, 2000);
    }

}

至于Adapter的代码与上一篇博客中的Adapter一样。


最后,一个可以上拉加载的ListView就完成了,下面附上所有代码的下载地址:


下载地址


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值