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. POJ2536 二分图匹配

    题意:      有n只老鼠,m个洞,每个洞最多可以藏一只老鼠,每个老鼠的移动速度都是v,给你他们的当前坐标,和洞的坐标,突然老鹰来了,他们必须在s秒内跑到一个洞藏起来,问你最少有多少只老鼠被抓走了. ...

  2. Xposed框架中XSharePreference的使用

    本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/81194406 在Xposed框架的模块编写中,通常希望我们自己写的Android ...

  3. POJ1087DFS+匈牙利或者DINIC

    题意:      有n个插孔,m个电器,q种转换器(转换器可以无限用),然后问你最多有多少个电器能充电. 思路:       比较简单,就是在建图的时候要考虑下,我用了两种方法做的,一个是最大流,这个 ...

  4. CreateThread 线程操作与 _beginthreadex 线程安全(Windows核心编程)

    0x01 线程的创建 线程不同于进程,Windows 中的进程是拥有 '惰性' 的,本身并不执行任何代码,而执行代码的任务转交给主线程,列如使用 CreateProcess 创建一个进程打开 Cmd ...

  5. xml数据解析和生成

    java中xml的解析方式有许多,有java自带的DOM.SAX,android中的PULL,其它的还有DOM4J.JDOM等. 本文简要讲述DOM.SAX.PULL三种方式. 1.DOM方法 缺点: ...

  6. thinkphp 中区块block和模板继承extend用法举例

    1.介绍 模板继承其实并不难理解,就好比类的继承一样,模板也可以定义一个基础模板(或者是布局),并且其中定义相关的区块(block),然后继承(extend)该基础模板的子模板中就可以对基础模板中定义 ...

  7. Java枚举类、注解和反射

    本文主要介绍的是枚举类,注解和反射.还有一些基础知识:static,基本数据类型,运算符优先级放在文中,以便查阅复习. 其中牵扯到泛型的部分,可参考本人的另一篇博客:(Collection, List ...

  8. 推荐系统论文之序列推荐:KERL

    KERL: A Knowledge-Guided Reinforcement Learning Modelfor Sequential Recommendation 摘要 ‍时序推荐是基于用户的顺序行 ...

  9. OOP第三章博客

    OO第三单元博客 • (1)梳理JML语言的理论基础.应用工具链情况: 理论基础: 网络资料上面介绍JML有两种主要的用法: 开展规格化设计.这样交给代码实现人员的将不是可能带有内在模糊性.二义性的自 ...

  10. (Dubbo架构)基于MDC+Filter的跨应用分布式日志追踪解决方案

    在单体应用中,日志追踪通常的解决方案是给日志添加 tranID(追踪ID),生成规则因系统而异,大致效果如下: 查询时只要使用 grep 命令进行追踪id筛选即可查到此次调用链中所有日志,但是在 du ...