1.分頁幫助類

前言:

  分頁列表, 可謂是家常便飯.   完成分頁邏輯,需要的模板程式碼比較多. 應將這些程式碼歸納封裝,統一處理;

1.1 模板程式碼有哪些:

  1.頁碼, 資料

  2.載入更多功能的控制 (最後一頁時關閉載入邏輯,  重新整理時重置頁碼, 重新啟動載入邏輯)

  3.網路請求,

  4.更甚至, Adapter初始化.  RecycleView初始化,  空佔位圖情況下切換顯示沒有更多View等

1.2 helper 執行過程:

  1.初始化

  2.獲取請求引數, 請求地址, 發起網路請求;  解析響應

  3.如果當前不是第一頁, 則追加資料;  如果當前最後一頁, 則顯示沒有更多

  4.如果第一頁, 判斷啟動載入更多的監聽;  (空佔位等)

博主使用的 loadmorewrapper 這個庫.

implementation 'com.github.nukc:loadmorewrapper:1.8.3'

博主並沒有把這個類維護的比較完善, 這年頭也只有老程式設計師才會在Activity中發請求吧; 這個類只當做是一次對模板程式碼的封裝吧; 有興趣的小夥伴可以自行控制執行邏輯; 

由於後臺給的資料形式比較亂, 網路請求的返回值用json接收;

MVP 版本的話,  需要分開單獨處理 view, presenter 層;  也可以用繼承方式抽調模板程式碼;

好, 我們上程式碼 (用 kotlin 寫的)

注意:  博主 executePOST() 方法的第一個引數是個 tag; 頁面關閉時,會取消網路請求; 防止記憶體洩漏

class MyPageHelper<T, A : BaseAdapter<T>>(
val mAdapter: A,
private val mRecycle: RecyclerView,
private val mView: PagingView) { //頁碼引數
private val pageInit = 1
private var page: Int = 1
private var pageSize: Int = 10
private var maxPage: Int = 1 private var mWrapper: LoadMoreWrapper? = null
private var mEnabled: LoadMoreAdapter.Enabled? = null
private lateinit var mData: MutableList<T> /**
* 初始化就執行載入; 也可以用load()方法延遲載入;
*/
init {
refresh()
} // fun load(){
// refresh()
// } /**
* 重新整理重置資料
*/
fun refresh(){
page = pageInit
requestData()
} private fun requestData(){
val map = ArrayMap<String,Any>()
map["page"] = page
map["pageSize"] = pageSize
val url = mView.prepareMap(map) OkGoUtils.executePOST(mView, url, map, object : OkGoCallBack {
override fun onSuccess(jsonObject: JSONObject, msg: String, params: Map<String, Any>) {
val jo = jsonObject.getJSONObject("data")
maxPage = if(jo.has("totalPage")) jo.getInt("totalPage") else 1
val data = mView.analysisData(jo)
updateData(data as MutableList<T>)
} override fun onFailure(msg: String) {
ToastUtil.toastShortMessage(msg)
}
})
} /**
* 更新資料集合
*/
private fun updateData(data: MutableList<T>) {
//根據是不是第一頁, 來處理資料;
if (page <= pageInit) {
disposeFirstPage(data)
} else {
if(data.isNotEmpty()) {
mAdapter.data.addAll(data)
mAdapter.notifyDataSetChanged()
}
}
/**
* 如果當前頁碼值, 已經超過總頁碼數, 則沒有更多
*/
noMoreData(page >= maxPage)
} /**
* 第一頁資料處理邏輯;
*/
private fun disposeFirstPage(data: MutableList<T>) {
//第一個資料, 必定重新賦值;
mData = data
//mAdapter 中 setData 時自動 notifyDataSetChanged();
mAdapter.data = mData
if(mWrapper == null){
//只有當 mWrapper 為null時 才初始化
mWrapper = LoadMoreWrapper.with(mAdapter).apply {
setShowNoMoreEnabled(true) // enable show NoMoreView,default false
setListener { enabled: LoadMoreAdapter.Enabled ->
mEnabled = enabled
if (page >= maxPage) {
noMoreData(true)
} else {
page++
requestData()
}
}.into(mRecycle)
}
}else{
//是否顯示沒有更多檢視; 當顯示空資料佔位圖時,才可能置為false;
mWrapper?.setShowNoMoreEnabled(true)
}
} /**
* 控制載入更多功能;
*/
private fun noMoreData(none: Boolean) {
mEnabled?.let {
if (none) {
it.loadMoreEnabled = false //停止載入更多邏輯
//更新指定位置,Adapter一般有得到資料和設定資料; 為什麼沒有 -1? 沒有更多頁面也算一條
mAdapter.notifyItemChanged(mAdapter.itemCount)
} else {
it.loadMoreEnabled = true //啟動載入更多邏輯
}
}
} interface PagingView{
/**
* 維護請求資料
*/
fun prepareMap(map: ArrayMap<String, Any>) : String /**
* format Request響應; 解析成 Adapter 所需資料集合
*/
fun analysisData(jo: JSONObject): MutableList<out Any>
// fun loading()
// fun hideLoading()
}

使用:

1.activity, fragment 需要實現 PagingView;  提供請求連線,及請求引數;  以及解析資料

2.初始化, RecycleView Adapter,  並啟動例項化 MyPageHelper

  initRecycle(){
    //... 初始化 Adapter, RecycleView, 並例項化 MyPageHelper 
    mHelper = MyPageHelper<>(mAdapter, rv_recycle, this)
  }

  override fun prepareMap(map: ArrayMap<String, Any>): String {
map["cycleId"] = cycleId
return APIConfig.ARTICLE_LIST_AUDIT
} override fun analysisData(jo: JSONObject): MutableList<out Any> {
maxNum = jo.getInt("totalNum")
return GsonUtils.toList(jo.getString("newsList"), NewsEntity::class.java)
}

回到頂部