一、第三方组件
Rxhttp:https://github.com/liujingxing/rxhttp
SmartReFresh:https://github.com/scwang90/SmartRefreshLayout
BaseQuickAdapter:https://blog.csdn.net/CJQ316210/article/details/98855593
二、使用步骤:
1、新建布局
<com.scwang.smart.refresh.layout.SmartRefreshLayout
android:id="@id/mFilterContentView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rc_exhibition"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp">
</androidx.recyclerview.widget.RecyclerView>
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
2、创建自己Adapter
使用BaseQuickAdapter代替传统的Adapter减少编写的代码量,方便好用,谁用谁知道。
//1、创建自定义Adapter继承BaseQuickAdapter
//2、添加泛型1为需要绑定的数据2为固定类
//3、传入需要绑定数据的布局文件
class PackagedProductsExhibitionAdapter : BaseQuickAdapter<PackageListData.Data, BaseViewHolder>(R.layout.item_packaged_products_exhibition) {
//可以通过BaseViewHolder找到布局中的子组件来进行很多动态操作
override fun convert(holder: BaseViewHolder, item: PackageListData.Data) {
//使用Glide绑定图片
Glide.with(context).load(item.wholeImage)
.into(holder.getView<ImageView>(R.id.tv_1))
//绑定文字
holder.setText(R.id.stv_title,item.title)
}
}
3、在Activity中初始化RecycleView
//设置布局管理器
rcExhibition.layoutManager = GridLayoutManager(me,2)
//绑定RecyclerView
adapter = PackagedProductsExhibitionAdapter()
rcExhibition.setAdapter(adapter)
adapter!!.recyclerView = rcExhibition
//设置模块的点击事件,将要点击的子组件放入该方法
adapter.addChildClickViewIds(R.id.tv_update, R.id.tv_delete)
//列表项的点击事件监听
adapter.setOnItemClickListener { adapter, view, position ->
}
//设置子组件点击事件监听,只能对addChildClickViewIds中的组件进行监听
adapter.setOnItemChildClickListener { adapter, view, position ->
//可以使用view.findViewById来找到控件进行操作
}
4、在Activtiy中使用SmartRefresh
//找到该控件
@BindView(R.id.mFilterContentView)
lateinit var mRefreshLayout: SmartRefreshLayout
//编写上拉监听
mRefreshLayout.setOnRefreshListener { refreshLayout ->
getData(
Constant.FIRST_LOAD,
refreshLayout
)
}
mRefreshLayout.setOnLoadMoreListener { refreshLayout ->
getData(
Constant.MORE_LOAD,
refreshLayout
)
}
5、在Activity中使用Rxhttp编写请求方法
这里并不是我一般的请求方式,我通常把上拉刷新和下拉加载分别放在两个请求方法内部,个人认为这样的代码更容易维护。这里使用了fastJson构建请求体
private fun getData(type: String, layout: RefreshLayout) {
val `object`: JSONObject
when (type) {
Constant.FIRST_LOAD -> {
currentPage = 1
`object` = JSONObject()
`object`["page"] = currentPage
`object`["limit"] = Constant.PACKAAGE_PAGESIZE
RxHttp.postJson(Constant.PACKAGELIST)
.addHeader(Constant.TOKEN, AppSharedPreferences.getInstance(me).token)
.addAll(`object`.toJSONString())
.asClass(PackageListData::class.java)
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ s ->
//请求成功后对recycleView添加请求数据
adapter!!.setNewInstance(s.data)
//调用smartRefresh的finishRefresh(毫秒)延迟多少时间结束刷新
layout.finishRefresh(800)
}) { throwable: Throwable ->
Log.e("整装产品列表", "throwable:" + throwable.message)
ToastUtils.showShort("请求失败")
layout.finishRefresh(false)
}
}
Constant.MORE_LOAD -> {
currentPage++
`object` = JSONObject()
`object`["page"] = currentPage
`object`["limit"] = Constant.PACKAAGE_PAGESIZE
RxHttp.postJson(Constant.PACKAGELIST)
.addHeader(Constant.TOKEN, AppSharedPreferences.getInstance(me).token)
.addAll(`object`.toJSONString())
.asClass(PackageListData::class.java)
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ s ->
//下拉加载需要进行分页处理
if (s.data.size == 0){
//请求的数据数组size为0表示没有数据了,没有更多可以加载结束上拉加载
//1延迟ms,2数据是否成功,3是否有更多数据
layout.finishLoadMore(0, true, true)
}
//请求数据不为null且size大小不为0表示还有数据需要加载
if (s.data != null && s.data.size != 0) {
//给adapter继续添加数据
adapter.addData(s.data)
//1延迟ms,2数据是否成功,3是否有更多数据
layout.finishLoadMore(800, true, false)
}
}) { throwable: Throwable? ->
runOnUiThread {
ToastUtils.showShort("请求失败")
layout.finishLoadMore(false)
}
}
}
}
}
网友评论