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已經可見),如果是向上滾動,滾動到了最后一條,且沒有觸發正在加載時,就可以觸發自動加載更多了。
我們來看下效果圖

效果圖

大家可以運行源碼或下載波尼音樂查看詳細效果。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容