一舶替、第三方組件
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氛堕、創(chuàng)建自己Adapter
使用BaseQuickAdapter代替?zhèn)鹘y(tǒng)的Adapter減少編寫的代碼量,方便好用馏臭,誰用誰知道。
//1讼稚、創(chuàng)建自定義Adapter繼承BaseQuickAdapter
//2括儒、添加泛型1為需要綁定的數(shù)據(jù)2為固定類
//3、傳入需要綁定數(shù)據(jù)的布局文件
class PackagedProductsExhibitionAdapter : BaseQuickAdapter<PackageListData.Data, BaseViewHolder>(R.layout.item_packaged_products_exhibition) {
//可以通過BaseViewHolder找到布局中的子組件來進(jìn)行很多動態(tài)操作
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
//設(shè)置布局管理器
rcExhibition.layoutManager = GridLayoutManager(me,2)
//綁定RecyclerView
adapter = PackagedProductsExhibitionAdapter()
rcExhibition.setAdapter(adapter)
adapter!!.recyclerView = rcExhibition
//設(shè)置模塊的點(diǎn)擊事件,將要點(diǎn)擊的子組件放入該方法
adapter.addChildClickViewIds(R.id.tv_update, R.id.tv_delete)
//列表項(xiàng)的點(diǎn)擊事件監(jiān)聽
adapter.setOnItemClickListener { adapter, view, position ->
}
//設(shè)置子組件點(diǎn)擊事件監(jiān)聽,只能對addChildClickViewIds中的組件進(jìn)行監(jiān)聽
adapter.setOnItemChildClickListener { adapter, view, position ->
//可以使用view.findViewById來找到控件進(jìn)行操作
}
4帮寻、在Activtiy中使用SmartRefresh
//找到該控件
@BindView(R.id.mFilterContentView)
lateinit var mRefreshLayout: SmartRefreshLayout
//編寫上拉監(jiān)聽
mRefreshLayout.setOnRefreshListener { refreshLayout ->
getData(
Constant.FIRST_LOAD,
refreshLayout
)
}
mRefreshLayout.setOnLoadMoreListener { refreshLayout ->
getData(
Constant.MORE_LOAD,
refreshLayout
)
}
5、在Activity中使用Rxhttp編寫請求方法
這里并不是我一般的請求方式,我通常把上拉刷新和下拉加載分別放在兩個請求方法內(nèi)部赠摇,個人認(rèn)為這樣的代碼更容易維護(hù)固逗。這里使用了fastJson構(gòu)建請求體
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添加請求數(shù)據(jù)
adapter!!.setNewInstance(s.data)
//調(diào)用smartRefresh的finishRefresh(毫秒)延遲多少時間結(jié)束刷新
layout.finishRefresh(800)
}) { throwable: Throwable ->
Log.e("整裝產(chǎn)品列表", "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 ->
//下拉加載需要進(jìn)行分頁處理
if (s.data.size == 0){
//請求的數(shù)據(jù)數(shù)組size為0表示沒有數(shù)據(jù)了,沒有更多可以加載結(jié)束上拉加載
//1延遲ms,2數(shù)據(jù)是否成功,3是否有更多數(shù)據(jù)
layout.finishLoadMore(0, true, true)
}
//請求數(shù)據(jù)不為null且size大小不為0表示還有數(shù)據(jù)需要加載
if (s.data != null && s.data.size != 0) {
//給adapter繼續(xù)添加數(shù)據(jù)
adapter.addData(s.data)
//1延遲ms,2數(shù)據(jù)是否成功,3是否有更多數(shù)據(jù)
layout.finishLoadMore(800, true, false)
}
}) { throwable: Throwable? ->
runOnUiThread {
ToastUtils.showShort("請求失敗")
layout.finishLoadMore(false)
}
}
}
}
}