基于现如今的大数据时代,大量的网络数据不可能一次性在客户端全部加载,于是我们总是每次加载一部分数据,当ListView滑动到底部时自动进行加载更多,由于使用比较频繁,想着把这个控件进行一个封装,以后可以方便使用。
主要思路:第一步重写自己的类继承ListView,然后为我们自己的ListView添加一个footer来表示滑动到底部时的提示,最后在OnScrollListener中进行判断是否滑动到底部,若此时滑动到底部,并且没有正在加载则执行加载方法。接下来代码实现:
1.重写自己的View并添加一个footer
public AutoLoadListView(Context context) {
super(context);
initView(context);
}
public AutoLoadListView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public AutoLoadListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(context);
}
// 初始化组件
private void initView(Context context) {
inflater = LayoutInflater.from(context);
footer = inflater.inflate(R.layout.listview_footer, null);
loadFull = (TextView) footer.findViewById(R.id.footer_loadFull);
loadFail = (TextView) footer.findViewById(R.id.footer_noData);
loadIng = (TextView) footer.findViewById(R.id.footer_more);
progressBar = (ProgressBar) footer.findViewById(R.id.footer_loading);
addFooterView(footer);
setOnScrollListener(this);//设置滑动监听事件
}
2.写一个回调接口来执行自动加载的方法
// 加载更多监听
public void setOnLoadListener(OnLoadListener onLoadListener) {
mOnLoadListener = onLoadListener;
}
public interface OnLoadListener {
public void onLoad();
}
3.在OnScrollListener中判断是否滑动到底部,
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (!isLoading && view.getLastVisiblePosition() == view.getCount() - 1) {
isLoading = true;
setloading();
if (mOnLoadListener != null) {
mOnLoadListener.onLoad();
}
}
}
注意:因为我们添加了一个footer,所以滑动到最低部的判断条件为view.getLastVisiblePosition() == view.getCount() - 1,需要对总数减一
4.给出当加载结束后需要调用的方法,重置isLoading的值,和footer的显示
// 用于加载更多结束后的回调
public void onLoadComplete() {
isLoading = false;
setLoadFull();
}
// 加载失败时footer显示
public void setLoadFailed() {
loadIng.setVisibility(View.GONE);
loadFull.setVisibility(GONE);
progressBar.setVisibility(GONE);
loadFail.setVisibility(VISIBLE);
}
// 加载完成时footer显示
public void setLoadFull() {
loadIng.setVisibility(View.GONE);
loadFull.setVisibility(VISIBLE);
progressBar.setVisibility(GONE);
loadFail.setVisibility(GONE);
}
// 正在加载时footer显示
private void setloading() {
loadIng.setVisibility(View.VISIBLE);
loadFull.setVisibility(GONE);
progressBar.setVisibility(VISIBLE);
loadFail.setVisibility(GONE);
}
附上总体源码:
package com.example.test;
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 android.widget.ProgressBar;
import android.widget.TextView;
public class AutoLoadListView extends ListView implements OnScrollListener {
private static final String TAG = "AutoLoadListView";
private LayoutInflater inflater;
private View footer;
private TextView loadFail;
private TextView loadFull;
private TextView loadIng;
private ProgressBar progressBar;
private boolean isLoading;// 判断是否正在加载
private OnLoadListener mOnLoadListener;
public AutoLoadListView(Context context) {
super(context);
initView(context);
}
public AutoLoadListView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public AutoLoadListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(context);
}
// 初始化组件
private void initView(Context context) {
inflater = LayoutInflater.from(context);
footer = inflater.inflate(R.layout.listview_footer, null);
loadFull = (TextView) footer.findViewById(R.id.footer_loadFull);
loadFail = (TextView) footer.findViewById(R.id.footer_noData);
loadIng = (TextView) footer.findViewById(R.id.footer_more);
progressBar = (ProgressBar) footer.findViewById(R.id.footer_loading);
addFooterView(footer);
setOnScrollListener(this);
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (!isLoading && view.getLastVisiblePosition() == view.getCount() - 1) {
isLoading = true;
setloading();
if (mOnLoadListener != null) {
mOnLoadListener.onLoad();
}
}
}
// 用于加载更多结束后的回调
public void onLoadComplete() {
isLoading = false;
setLoadFull();
}
// 加载失败时footer显示
public void setLoadFailed() {
loadIng.setVisibility(View.GONE);
loadFull.setVisibility(GONE);
progressBar.setVisibility(GONE);
loadFail.setVisibility(VISIBLE);
}
// 加载完成时footer显示
public void setLoadFull() {
loadIng.setVisibility(View.GONE);
loadFull.setVisibility(VISIBLE);
progressBar.setVisibility(GONE);
loadFail.setVisibility(GONE);
}
// 正在加载时footer显示
private void setloading() {
loadIng.setVisibility(View.VISIBLE);
loadFull.setVisibility(GONE);
progressBar.setVisibility(VISIBLE);
loadFail.setVisibility(GONE);
}
// 加载更多监听
public void setOnLoadListener(OnLoadListener onLoadListener) {
mOnLoadListener = onLoadListener;
}
public interface OnLoadListener {
public void onLoad();
}
}