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)
}

回到顶部

孟老板 BaseAdapter封装(四) PageHelper的更多相关文章

  1. 孟老板 BaseAdapter封装(五) ListAdapter

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  2. 孟老板 BaseAdapter封装 (一) 简单封装

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  3. 孟老板 BaseAdapter封装 (二) Healer,footer

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  4. 孟老板 BaseAdapter封装 (三) 空数据占位图

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  5. 孟老板 ListAdapter封装, 告别Adapter代码 (上)

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  6. 孟老板 ListAdapter封装, 告别Adapter代码 (四)

    BaseAdapter系列 ListAdapter封装, 告别Adapter代码 (一) ListAdapter封装, 告别Adapter代码 (二) ListAdapter封装, 告别Adapter ...

  7. 孟老板 ListAdapter封装, 告别Adapter代码 (三)

    BaseAdapter系列 ListAdapter封装, 告别Adapter代码 (一) ListAdapter封装, 告别Adapter代码 (二) ListAdapter封装, 告别Adapter ...

  8. 孟老板 Paging3 (二) 结合Room

    BaseAdapter系列 ListAdapter系列 Paging3 (一) 入门 Paging3 (二) 结合 Room Paging3 (二)  结合Room Paging 数据源不开放, 无法 ...

  9. 孟老板 Paging3 (一) 入门

    BaseAdapter系列 ListAdapter系列 Paging3 (一) 入门 Paging3 (二) 结合 Room Paging3 (一)  入门 前言: 官方分页工具,  确实香.   但 ...

随机推荐

  1. 修改Android手机内核,绕过反调试

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/57086486 0x1.手机设备环境 Model number: Nexus 5 O ...

  2. WIN64内核编程-的基础知识

    WIN64内核编程基础班(作者:胡文亮)   https://www.dbgpro.com/x64driver 我们先从一份"简历"说起: 姓名:X86或80x86 性别:? 出生 ...

  3. AsSystemRum 系统提权工具 实现思路及其源码

    名字:     AsSystemRun 功能:     用system权限启动一个进程. 开发语言:   C++,C# 作者:     Ack-Code 开发时间: 2016.9.15 实现原理: w ...

  4. Mac 右键强化工具-超级右键

    App Store 功能介绍 1.新建文件 默认支持新建:TXT/RTF/XML/Word/Excel/PPT/WPS文字/WPS表格/WPS演示/Pages/Numbers/keynote/Ai/P ...

  5. FTP主动模式(PORT)与被动模式(PASV)

    待完善 参考文章0 参考文章1

  6. MySQL慢日志全解析

    前言: 慢日志在日常数据库运维中经常会用到,我们可以通过查看慢日志来获得效率较差的 SQL ,然后可以进行 SQL 优化.本篇文章我们一起来学习下慢日志相关知识. 1.慢日志简介 慢日志全称为慢查询日 ...

  7. 匿名函数lambda / map()方法

    lambda一般配合其他方法使用,一般使用在只用过一次就不用的函数,那就没必要特意去定义 lambda能支持的最复杂的语句就是三元运算 例如: lambda x,y: x*y if x < y ...

  8. 1小时快速搭建基于Azure Custom Vision和树莓派的鸟类分类和识别应用

    1. 引言 最近在微软Learn平台学习Azure认知服务相关的内容,看到了一个有关"使用自定义视觉对濒危鸟类进行分类"的专题,该专题的主要内容就是使用 Azure Custom ...

  9. [刷题] 209 Minimum Size Subarray Sum

    要求 给定一个含有 n 个正整数的数组和一个正整数 s 找出该数组中满足其和 ≥ s 的长度最小的连续子数组 如果不存在符合条件的连续子数组,返回 0 示例 输入:s = 7, nums = [2,3 ...

  10. Docker------Linux安装Docker

    1.添加yum源 yum install epel-release –y yum clean all yum list 2.安装并运行Docker yum install docker-io –y s ...