Android-Rxhttp配合RecycleView、SmartReFresh完成列表上拉加载下拉刷新功能

一、第三方组件

Rxhttp:https://github.com/liujingxing/rxhttp
SmartReFresh:https://github.com/scwang90/SmartRefreshLayout
BaseQuickAdapter:https://blog.csdn.net/CJQ316210/article/details/98855593

二、使用步骤:

1、新建布局

            
                
                
            

2、创建自己Adapter
使用BaseQuickAdapter代替传统的Adapter减少编写的代码量,方便好用,谁用谁知道。

//1、创建自定义Adapter继承BaseQuickAdapter
//2、添加泛型1为需要绑定的数据2为固定类
//3、传入需要绑定数据的布局文件
class PackagedProductsExhibitionAdapter : BaseQuickAdapter(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(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)
                        }
                    }
            }
        }
    }

你可能感兴趣的:(Android-Rxhttp配合RecycleView、SmartReFresh完成列表上拉加载下拉刷新功能)