你經常聽到“上拉加載”這樣的字眼嗎?你知道這個功能是怎么實現的嗎?這篇文章記錄了我對“上拉加載”的實現,與大家一起分享。
“上拉加載”針對的是RecyclerView或者Listview這樣的列表控件(本文以RecyclerView為例),一般和“數據分頁”配合使用,旨在實現“分頁加載,隨用隨取”,從而避免了一個接口返回過多的數據。
RecyclerView每加載一個item都會調用一次onBindViewHolder方法,並且只在item由不可見變為可見的時候才會調用此方法。我們可以通過onBindViewHolder方法來判斷是否已經到達列表的底部。
public void onBindViewHolder(CollectionViewHolder holder, int position) { holder.fillData(mData.get(position)); if(position == getItemCount()-1){//已經到達列表的底部 loadMoreData(); } }
上面代碼中我們通過比較position和getItemCount判斷當前加載的item是不是最后一條,如果是最后一條的話就要執行網絡請求加載下一頁數據。
上面就是我實現“上拉加載”的核心思想。使用過程中僅僅這樣還是不夠的,還需要繼續完善、優化,下面記錄一下我是如何添加底部提示的。
描述:如果所有的數據都已經加載完畢了(服務器已經返回了最后一頁數據),我們在最后一條數據下面顯示一個“沒有更多”的提示。
實現:這里要提一下RecyclerView加載item的原理:RecyclerView在加載item之前會調用getItemCount方法,然后調用相同次數的onBindViewHolder方法,顯示相同條數的數據。現在我需要RecyclerView在原來數據的基礎之上,多顯示一條數據,所以我進行了如下修改:
public int getItemCount() { return mData.size() + 1; }
這樣就為“提示”這根蘿卜挖好了一個坑。可是onCreateViewHolder並沒有position這樣的參數,我們沒有辦法為普通數據項和最后一行的提示項生成特定的item。我是通過這樣的方法解決這個問題的,我把數據項的展示布局和“沒有更多”的布局放在同一個item當中,然后再根據onBindViewHolder傳遞過來的position來控制最終顯示哪一個布局。
上面是比較基礎一點的操作,其實關於提示項的顯示要比這個復雜得過,要考慮很多情況,如何判斷服務器返回的是最后一頁,已顯示和未顯示的判斷和狀態的更新。有時間再繼續聊!
