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

回到顶部

最新文章

  1. fatal error C1083: 无法打开包括文件:&ldquo;stddef.h&rdquo;: No such file or directory
  2. 手动创建oem
  3. Openwrt 无法上40MHZ带宽
  4. Foreach 与 Foreach-Object 的区别
  5. Flexigrid自定义显示数据列
  6. UVa 1642 (综合) Magical GCD
  7. DJANGO的HTTPRESPONSE流式输出
  8. UVa 11879 - Multiple of 17
  9. marble 基本函数(一)
  10. poj2104 Kth-Number
  11. HTML5&amp;CSS3读书笔记
  12. 切换npm源地址
  13. MFC动态创建对话框中的按钮控件并创建其响应消息
  14. Docker容器开机自动启动
  15. Mybatis中的StatementType
  16. 请教神牛_字符串hash
  17. URL some
  18. EOJ #276
  19. IT行业——Linux
  20. [翻译] RSKImageCropper

热门文章

  1. hdu1671 字典树记录前缀出现次数
  2. Hook android系统调用的实践
  3. AppScan扫描器的用法
  4. idea中注释变成繁体字
  5. JDBC相关配置和操作
  6. Servlet三大域对象
  7. Django(1)初识Django
  8. 探索GaussDB(DWS)的过程化SQL语言能力
  9. .NET程序崩溃了怎么抓 Dump ? 我总结了三种方案
  10. [设计模式] 设计模式课程(二十)--命令模式(Command)