系列文章
- Android開源線上音樂播放器——波尼音樂
- Android開源音樂播放器之播放器基本功能
- Android開源音樂播放器之高仿雲音樂黑膠唱片
- Android開源音樂播放器之自動滾動歌詞
- Android開源音樂播放器之線上音樂列表自動載入更多
前言
當我們的ListView資料比較多時,我們一般都會選擇分頁顯示,而分頁顯示就需要一個動作觸發載入更多操作,通常我們會使用上拉載入更多,但我覺得不夠人性化,因為使用者需要手動上拉,所以更加人性化的方案應該是列表滾動到底部自動載入更多。我們以線上音樂列表為例,由於不需要重新整理,因此這裡我們不討論重新整理功能。
思路分析
觸發自動載入後,需要在ListView底部顯示一個進度條,表示正在載入。我們最容易想到的辦法就是給ListView新增FooterView,這也是最直接的辦法。但ListView的addFooterView方法有一個限制,必須在setAdapter之前呼叫,而我們顯示正在載入進度條前,肯定要先給ListView設定介面卡,這樣就比較尷尬了。這時我們就要用到ListView的另一個特性了,那就是雖然不能在setAdapter之後呼叫addFooterView,但可以在setAdapter之前呼叫addFooterView,緊接著呼叫removeFooterView,將進度條隱藏掉,然後就可以隨時呼叫addFooterView,而不管setAdapter是否已經被呼叫。
程式碼實現
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已經可見),如果是向上滾動,滾動到了最後一條,且沒有觸發正在載入時,就可以觸發自動載入更多了。
我們來看下效果圖
遷移自我的簡書 2016.06.09