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

chay發表於2019-01-11

系列文章

前言

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

相關文章