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. 【原创】ansible-playbook 详解

    YAML的语法和其他高阶语言类似并且可以简单表达清单.散列表.标量等数据结构.(列表用横杆表示,键值对用冒号分割,键值对里又可以嵌套另外的键值对) YAML文件扩展名通常为.yaml或者.yml.下面 ...

  2. 绕过网站WAF(图片绕过)

    当我们在渗透一个网站的时候,很多时候,会遇到下面这种情况.网站装有WAF,把我们的SQL注入语句给拦截了. 这就是网站的安全狗 此时,我们的渗透会陷入僵局.到底应该如何才能让我们的语句绕过安全狗的检查 ...

  3. XCTF-FlatScience

    FlatScience 题目描述 啥描述也没有 解题过程 页面有好多链接,除了论文pdf之外,还有子目录下的index.html, 比如:/1/index.html,/1/3/index.html 扫 ...

  4. Web中的相对路径和绝对路径

    前台路径:浏览器端发起的资源请求路径 后台路径:服务器端发起的资源请求路径

  5. Docker简单流程

  6. Java并发工具篇

    theme: juejin highlight: an-old-hope 作者:汤圆 个人博客:javalover.cc 前言 随着天气的逐渐变热,整个人也开始浮躁不安 当然这里说的不是我,因为我是一 ...

  7. 2021ArchSummit全球架构师峰会上,大家在聊些什么

    大会PPT公开下载链接:https://ppt.infoq.cn/list/assh2021 大会主要情况介绍 2021 ArchSummit全球架构师峰会是该大会正式成立的第十年,是极客邦科技旗下I ...

  8. C++ scanf_s()函数的用法以及注意事项

    前身--scanf() 有的教材里用的scanf(),其实在目前Visual Studio版本中已经弃用了,用scanf_s()函数代替了. 为什么现在要用scanf_s() scanf_s()函数是 ...

  9. 剑指offer 数组中的重复数字

    问题描述: 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1 ...

  10. coverage report

    转载:http://blog.sina.cn/dpool/blog/s/blog_7853c3910102yn77.html VCS仿真可以分成两步法或三步法, 对Mix language, 必须用三 ...