在我的上一篇博客中(大家感兴趣的可以看一下我的上一篇博客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就完成了,下面附上所有代码的下载地址: