孟老板 BaseAdapter封装(四) PageHelper
- BaseAdapter封装(一) 简单封装
- BaseAdapter封装(二) Header,footer
- BaseAdapter封装(三) 空数据占位图
- BaseAdapter封装(四) PageHelper
- BaseAdapter封装(五) ListAdapter
- BaseAdapter封装(六) Healer,footer for List
- BaseAdapter封装(七) ConcatAdapter 改建头尾
- BaseAdapter封装(八) Paging 分页
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的更多相关文章
- 孟老板 BaseAdapter封装(五) ListAdapter
BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...
- 孟老板 BaseAdapter封装 (一) 简单封装
BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...
- 孟老板 BaseAdapter封装 (二) Healer,footer
BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...
- 孟老板 BaseAdapter封装 (三) 空数据占位图
BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...
- 孟老板 ListAdapter封装, 告别Adapter代码 (上)
BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...
- 孟老板 ListAdapter封装, 告别Adapter代码 (四)
BaseAdapter系列 ListAdapter封装, 告别Adapter代码 (一) ListAdapter封装, 告别Adapter代码 (二) ListAdapter封装, 告别Adapter ...
- 孟老板 ListAdapter封装, 告别Adapter代码 (三)
BaseAdapter系列 ListAdapter封装, 告别Adapter代码 (一) ListAdapter封装, 告别Adapter代码 (二) ListAdapter封装, 告别Adapter ...
- 孟老板 Paging3 (二) 结合Room
BaseAdapter系列 ListAdapter系列 Paging3 (一) 入门 Paging3 (二) 结合 Room Paging3 (二) 结合Room Paging 数据源不开放, 无法 ...
- 孟老板 Paging3 (一) 入门
BaseAdapter系列 ListAdapter系列 Paging3 (一) 入门 Paging3 (二) 结合 Room Paging3 (一) 入门 前言: 官方分页工具, 确实香. 但 ...
随机推荐
- 【原创】ansible-playbook 详解
YAML的语法和其他高阶语言类似并且可以简单表达清单.散列表.标量等数据结构.(列表用横杆表示,键值对用冒号分割,键值对里又可以嵌套另外的键值对) YAML文件扩展名通常为.yaml或者.yml.下面 ...
- 绕过网站WAF(图片绕过)
当我们在渗透一个网站的时候,很多时候,会遇到下面这种情况.网站装有WAF,把我们的SQL注入语句给拦截了. 这就是网站的安全狗 此时,我们的渗透会陷入僵局.到底应该如何才能让我们的语句绕过安全狗的检查 ...
- XCTF-FlatScience
FlatScience 题目描述 啥描述也没有 解题过程 页面有好多链接,除了论文pdf之外,还有子目录下的index.html, 比如:/1/index.html,/1/3/index.html 扫 ...
- Web中的相对路径和绝对路径
前台路径:浏览器端发起的资源请求路径 后台路径:服务器端发起的资源请求路径
- Docker简单流程
- Java并发工具篇
theme: juejin highlight: an-old-hope 作者:汤圆 个人博客:javalover.cc 前言 随着天气的逐渐变热,整个人也开始浮躁不安 当然这里说的不是我,因为我是一 ...
- 2021ArchSummit全球架构师峰会上,大家在聊些什么
大会PPT公开下载链接:https://ppt.infoq.cn/list/assh2021 大会主要情况介绍 2021 ArchSummit全球架构师峰会是该大会正式成立的第十年,是极客邦科技旗下I ...
- C++ scanf_s()函数的用法以及注意事项
前身--scanf() 有的教材里用的scanf(),其实在目前Visual Studio版本中已经弃用了,用scanf_s()函数代替了. 为什么现在要用scanf_s() scanf_s()函数是 ...
- 剑指offer 数组中的重复数字
问题描述: 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1 ...
- coverage report
转载:http://blog.sina.cn/dpool/blog/s/blog_7853c3910102yn77.html VCS仿真可以分成两步法或三步法, 对Mix language, 必须用三 ...