本來先看了 paging 的相關資料,發現順序有點不太對,應該先處理 RecyclerView 下滑時 UI 的細節,後續才可以去呼叫 API。
最直覺的處理方式就是在 RecyclerView 在下滑時去計算是不是需要讀更多的資料,不過在實做上的時候覺得一直滑動就在計算的頻率太高,所以先依 scrollview 是靜止的時候再去檢查。
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
shouldLoadMore()
}
}
})
private fun shouldLoadMore() {
layoutManager?.let {
if (it.findFirstCompletelyVisibleItemPosition() == RecyclerView.NO_POSITION) {
return
}
val lastPosition = it.findLastCompletelyVisibleItemPosition()
// 檢查目前顯示的筆數跟總個數的差異
val result = abs(it.itemCount - lastPosition)
// 檢查是不是最後一筆了
isLastPage = (it.itemCount - 1) == lastPosition
if (!isLastPage && abs(result) <= 8) {
Log.i(MainActivity.TAG, "loadmore")
}
}
}