一、概述:
应用场景聊天下拉加载聊天记录。
实现:
参考:SmartRefresh官方DEMO
1、布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:fitsSystemWindows="true"
android:orientation="vertical"
tools:context=".message.SettingMessageActivity">
<com.hjq.bar.TitleBar
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="系统消息"
/>
<com.scwang.smart.refresh.layout.SmartRefreshLayout
android:id="@+id/srl"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_message"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f4f4f4"
android:overScrollMode="never"
/>
<com.scwang.smart.refresh.footer.ClassicsFooter
android:id="@+id/footer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleY="-1"
app:srlTextPulling="下拉加载更多">
</com.scwang.smart.refresh.footer.ClassicsFooter>
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
</LinearLayout>
2、activity中
在activtiy初始化时设置
//设置加载更多组件
var arrow = footer.findViewById<View>(ClassicsFooter.ID_IMAGE_ARROW)
arrow.scaleY = -1f
//设置刷新组件
srl.setEnableRefresh(false) //必须关闭
srl.setEnableAutoLoadMore(true) //必须关闭
srl.setEnableNestedScroll(false) //必须关闭
srl.setEnableScrollContentWhenLoaded(true)//必须关闭
srl.layout.scaleY = -1f//必须设置
srl.setScrollBoundaryDecider(object : ScrollBoundaryDeciderAdapter(){
override fun canLoadMore(content: View?): Boolean {
return super.canRefresh(content) //必须替换
}
})
绑定事件监听
//只监听加载更多
srl.setOnLoadMoreListener(object : OnLoadMoreListener {
override fun onLoadMore(refreshLayout: RefreshLayout) {
page++
//发出请求加载数据
RequestMoreData(page)
}
})
加载更多数据方法
//加载更多数据
private fun RequestMoreData(pageNum: Int) {
//rxhttp获取后台数据
RxHttp.postJson(Constant.MYMESSAGE)
.addHeader(Constant.TOKEN, AppSharedPreferences.getInstance(me).token)
.add("limit", Constant.PAGESIZE)
.add("page", pageNum)
.asClass(MessageData::class.java)
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ a ->
if (a.data.size == 0){
Log.e("消息加载更多调试", "数据是否为0:" + a.data.size)
srl.finishLoadMore(0, true, true)
}
if (a.data != null && a.data.size != 0) {
//插入数据至开始位置而不是末尾加入
messageAdapter.addData(0,a.data)//addData(a.data)
srl.finishLoadMore(800, true, false)
}
}, { throwable ->
Log.e("消息加载更多调试", "error:" + throwable)
})
}
页面第一次获取数据时的绑定数据到RecyclerView操作
fun bindData(position : Int){
//设置recyclerView
rvRecyclerView.scaleY = -1f
var manager = LinearLayoutManager(me)
//该方法设置初始化时RecyclerView显示为列表底部,第一个参数postion为item项编号,第二个参数为距离顶部偏移量
manager.scrollToPositionWithOffset(position,0) //获取当前列表最大值减1,传入不存在的position则啥也不干
rvRecyclerView.layoutManager = manager
rvRecyclerView.adapter = messageAdapter
//保证开始时在最底部
messageAdapter.setOnItemClickListener { adapter, view, position ->
}
}