當咱們的ListView數據比較多時,咱們通常都會選擇分頁顯示,而分頁顯示就須要一個動做觸發加載更多操做,一般咱們會使用上拉加載更多,但我以爲不夠人性化,由於用戶須要手動上拉,因此更加人性化的方案應該是列表滾動到底部自動加載更多。咱們以在線音樂列表爲例,因爲不須要刷新,所以這裏咱們不討論刷新功能。java
觸發自動加載後,須要在ListView底部顯示一個進度條,表示正在加載。咱們最容易想到的辦法就是給ListView添加FooterView,這也是最直接的辦法。但ListView的addFooterView方法有一個限制,必須在setAdapter以前調用,而咱們顯示正在加載進度條前,確定要先給ListView設置適配器,這樣就比較尷尬了。這時咱們就要用到ListView的另外一個特性了,那就是雖然不能在setAdapter以後調用addFooterView,但能夠在setAdapter以前調用addFooterView,緊接着調用removeFooterView,將進度條隱藏掉,而後就能夠隨時調用addFooterView,而無論setAdapter是否已經被調用。git
public class AutoLoadListView extends ListView implements AbsListView.OnScrollListener {
private static final String TAG = AutoLoadListView.class.getSimpleName();
private View vFooter;
private OnLoadListener mListener;
private int mFirstVisibleItem = 0;
private boolean mEnableLoad = true;
private boolean mIsLoading = false;
public AutoLoadListView(Context context) {
super(context);
init();
}
// 其餘構造函數...
private void init() {
vFooter = LayoutInflater.from(getContext()).inflate(R.layout.auto_load_list_view_footer, null);
addFooterView(vFooter, null, false);
setOnScrollListener(this);
onLoadComplete();
}
public void setOnLoadListener(OnLoadListener listener) {
mListener = listener;
}
public void onLoadComplete() {
Log.d(TAG, "onLoadComplete");
mIsLoading = false;
removeFooterView(vFooter);
}
public void setEnable(boolean enable) {
mEnableLoad = enable;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
boolean isPullDown = firstVisibleItem > mFirstVisibleItem;
if (mEnableLoad && !mIsLoading && isPullDown) {
int lastVisibleItem = firstVisibleItem + visibleItemCount;
if (lastVisibleItem >= totalItemCount - 1) {
onLoad();
}
}
mFirstVisibleItem = firstVisibleItem;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
private void onLoad() {
Log.d(TAG, "onLoad");
mIsLoading = true;
addFooterView(vFooter, null, false);
if (mListener != null) {
mListener.onLoad();
}
}
}
複製代碼
代碼不長,就把它所有貼出來了,邏輯處理主要在onScroll
函數裏,首先根據上一個firstVisibleItem和當前的firstVisibleItem能夠判斷列表是否在向上滾動,而後比較firstVisibleItem + visibleItemCount和totalItemCount的大小能夠判斷列表是否滾動到了底部(即最後一個item已經可見),若是是向上滾動,滾動到了最後一條,且沒有觸發正在加載時,就能夠觸發自動加載更多了。 咱們來看下效果圖 github
遷移自個人簡書 2016.06.09bash