效果图:刷新两三次之后就看到“没有更多数据”了(^__^) 耐心点等gif播放哦。
demo下载:
自定义listview加载更多 - 下载频道 - youkuaiyun.com
http://download.youkuaiyun.com/detail/baidu_31093133/9824346
代码:
/**
* Created by REd on 2017/2/25.
* 上拉加载更多的listView
*/
public class LoadMoreListview extends ListView implements AbsListView.OnScrollListener {
/**
* 底部显示正在加载的页面
*/
private View footerView = null;
private ProgressBar footPro;
private TextView footText;
/**
* 存储上下文
*/
private Context context;
/**
* 上拉刷新的ListView的回调监听
*/
private ScripRefreshListviewCallBack scripRefreshListviewCallBack;
/**
* 记录第一行Item的数值
*/
private int firstVisibleItem;
public LoadMoreListview(Context context) {
super(context);
this.context = context;
initListView();
}
public LoadMoreListview(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
initListView();
}
/**
* 初始化ListView
*/
private void initListView() {
// 为ListView设置滑动监听
setOnScrollListener(this);
// 去掉底部分割线
setFooterDividersEnabled(false);
}
/**
* 初始化话底部页面
*/
public void initBottomView(int resId) {
if (footerView == null) {
footerView = LayoutInflater.from(this.context).inflate(
resId, null);
}
footPro = (ProgressBar) footerView.findViewById(R.id.foot_pro);
footText = (TextView) footerView.findViewById(R.id.foot_tv);
footPro.setVisibility(VISIBLE);
footText.setVisibility(VISIBLE);
addFooterView(footerView);
}
public void updateFootView() {
footPro.setVisibility(GONE);
footText.setText("没有更多数据了");
}
public void onScrollStateChanged(AbsListView view, int scrollState) {
//当滑动到底部时
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE
&& firstVisibleItem != 0) {
scripRefreshListviewCallBack.scrollBottomState();
}
}
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
this.firstVisibleItem = firstVisibleItem;
if (footerView != null) {
//判断可视Item是否能在当前页面完全显示
if (visibleItemCount == totalItemCount) {
// removeFooterView(footerView);
footerView.setVisibility(View.GONE);//隐藏底部布局
} else {
// addFooterView(footerView);
footerView.setVisibility(View.VISIBLE);//显示底部布局
}
}
}
public void setScripRefreshListviewCallBack(
ScripRefreshListviewCallBack myPullUpListViewCallBack) {
this.scripRefreshListviewCallBack = myPullUpListViewCallBack;
}
/**
* 上拉刷新的ListView的回调监听
*
* @author xiejinxiong
*/
public interface ScripRefreshListviewCallBack {
void scrollBottomState();
}
}
使用:
//传入自定义的加载数据的底布局
listview1.initBottomView(R.layout.foot_view);
//实现加载更多的回调
listview1.setScripRefreshListviewCallBack(new LoadMoreListview.ScripRefreshListviewCallBack() {
@Override
public void scrollBottomState() {//一旦滑到底部就会触发加载更多
Log.i("LHD", "scrollBottomState");
if (beans.size() < 30) {
loadData();
} else {//如果没有更多数据就调用updateFootView显示"没有更多数据"
listview1.updateFootView();
}
}
});