Android開源音樂播放器之在線音樂列表自動加載更多

系列文章

前言

當咱們的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

相關文章
相關標籤/搜索