前言
mBinding.recycler.linear().divider()
.set<OrdinaryListBean> {
addLayout(R.layout.layout_ordinary_item)
}.setList(getList())
假如我要说,除了数据和布局之外,以上的几行代码,就完结了一个列表加载,有老铁会信任吗?
能够很负责人的告知我们,通过Kotlin的DSL语言和扩展函数的运用,完结一个列表加载便是如此的简略,有的老铁可能会很懵,怎样没有看到适配器啊,也没有看到设置布局管理器啊,这便是此次封装的隐秘之处,弱化adapter的存在,当然了只是运用上弱化,其内部仍然用到了adapter。
通过代码上不断的完善,功用上不断的拓宽,现在的封装,现已满足绝大部分的常见需求,决议开源出来,期望能够给RecyclerView的运用上,带来一丝变化,当然了,此项目也会不定期更新,也欢迎我们在运用上提出自己的见解和问题,也期望点个小星星。
现在已开发功用:
本篇文章的概述如下
1、封装库快速运用
2、详细功用一一概述
3、开源地址
4、运用总结
5、后续规划
一、封装库快速运用
现在封装的库,现已上传到长途Maven,我们能够依照如下的过程进行运用:
1、在你的根项目下的build.gradle文件下,引进maven。
allprojects {
repositories {
maven { url "https://gitee.com/AbnerAndroid/almighty/raw/master" }
}
}
2、在你需求运用的Module中build.gradle文件下,引进依赖。
dependencies {
implementation 'com.vip:relist:1.0.5'//一个包括了列表加载和下拉改写、上拉加载的库,它包括了下面的两个库,运用它,下面的两个就不要引证了。
implementation 'com.vip:list:1.0.4'//列表加载库,假如运用了relist,这个不要再引证
implementation 'com.vip:refresh:1.0.0'//下拉改写、上拉加载库,假如运用了relist,这个不要再引证
}
需求留意的是,现在拆分了三个依赖,我们一定看清楚后,进行挑选运用。refresh依赖只是对SmartRefreshLayout包了一层,没有做过多的扩展,假如我们项目中现已有了改写库,其实只用list这个依赖即可。list库是纯RecyclerView封装库,没有用到任何的第三方,我们能够放心运用。
依赖 | 概述 | 版本号 | 集成 |
---|---|---|---|
relist | 一个包括了列表加载和下拉改写、上拉加载的库 | 1.0.5 | implementation’com.vip:relist:1.0.5′ |
list | 只包括列表加载(添加头尾、缺省页、侧滑删去、吸顶效果、分割线、DataBinding等) | 1.0.4 | implementation’com.vip:list:1.0.4′ |
refresh | 只包括下拉改写、上拉加载 | 1.0.0 | implementation’com.vip:refresh:1.0.0′ |
二、详细功用运用
关于功用上的运用,我们能够直接看源码,或许访问github地址后看运用说明也能够,当然了,在这儿我也罗列一下。
1、一般的列表加载
一般的列表加载,便是RecyclerView原始的用法,创立适配器Adapter,给RecyclerView设置布局管理器,给RecyclerView设置适配器,虽然说,Adapter现已抽取封装了,但考虑到还有一部分小伙伴具有怀旧认识,也很喜欢运用这种办法加载列表,所以呢,这种办法就保留了。
详细运用,举例如下:
创立适配器
即便是一般列表加载,这儿也是主张承继父类BaseAdapter,由于直接承继RecyclerView.Adapter的办法, 还得要重写一大堆办法,实在是冗余。
BaseAdapter对RecyclerView.Adapter做了一层封装,只需求传递要加载的layout和数据目标泛型即可,这两个就不贴源码了,一个是xml布局,一个自己界说的目标,没啥好说的。
数据绑定和逻辑处理,完结dataOperation办法即可,当然,这个也是强制要完结的办法。
class OrdinaryListAdapter : BaseAdapter<OrdinaryListBean>(R.layout.layout_ordinary_item) {
override fun dataOperation(holder: BaseViewHolder, t: OrdinaryListBean?, position: Int) {
t?.title?.let {
holder.setText(R.id.tv_title, it)
}
t?.desc?.let {
holder.setText(R.id.tv_desc, it)
}
val ivPic = holder.findView<ImageView>(R.id.iv_pic)
t?.icon?.let {
ivPic.setImageResource(it)
}
}
}
设置布局管理器和适配器
这些代码就比较熟悉了吧,都是RecyclerView的原始用法,点击事情调用adapter中的setOnItemClickListener办法即可。
由于运用了ViewDataBinding,这儿的mBinding.recycler指的是RecyclerView控件。
val manger = LinearLayoutManager(requireContext())
manger.orientation = LinearLayoutManager.VERTICAL
//设置布局管理器
mBinding.recycler.layoutManager = manger
val adapter = OrdinaryListAdapter()
//设置适配器
mBinding.recycler.adapter = adapter
//设置分割线
mBinding.recycler.addItemDecoration(
ItemDivider(
Color.parseColor("#cccccc"),
RecyclerView.VERTICAL, 0
)
)
//设置数据
adapter.setList(getList())
adapter.setOnItemClickListener {
//条目点击事情
Toast.makeText(requireContext(), "当时点击条目为:$it", Toast.LENGTH_SHORT).show()
}
简化设置布局管理器和适配器
看到上面的代码,仍是觉得有些冗余,一般列表加载,也是主张我们尽量运用简洁用法。
val adapter = OrdinaryListAdapter()
mBinding.recycler.linear()//设置布局管理器
.divider()//设置分割线
.adapter=adapter//设置适配器
//设置数据
adapter.setList(getList())
adapter.setOnItemClickListener {
//条目点击事情
Toast.makeText(requireContext(), "当时点击条目为:$it", Toast.LENGTH_SHORT).show()
}
布局管理器调用如下:
笔直列表:linear()
横向列表:linear(RecyclerView.HORIZONTAL)
网格列表:grid(2),一列展现几个,传递数值即可
瀑布流列表:staggered(2),一列展现几个,传递数值即可
至于其他的列表展现,如,网格和瀑布流办法,只需求更改布局管理器即可。
2、封装之后的列表加载
封装之后的列表加载,是引荐运用的,相对于一般的列表加载,完全弱化了适配器的存在,只需求考虑数据处理即可,十分的简略。
mBinding.recycler.linear()
.divider()
.set<OrdinaryListBean> {
addLayout(R.layout.layout_ordinary_item)
bindData {
//获取DataBinding
val binding = getDataBinding<LayoutOrdinaryItemBinding>()
//获取Model
val model = getModel(adapterPosition)
binding?.apply {
tvTitle.text = model.title
tvDesc.text = model.desc
ivPic.setImageResource(model.icon!!)
}
setOnItemClickListener {
//条目点击事情
Toast.makeText(requireContext(), "当时点击条目为:$it", Toast.LENGTH_SHORT)
.show()
}
}
}.setList(getList())
相关办法说明:
特点或办法 | 概述 |
---|---|
mBinding.recycler | 由于运用了ViewDataBinding,这儿的mBinding.recycler指的是RecyclerView控件。 |
linear | 布局管理器,可调用办法如下:笔直列表:linear()横向列表:linear(RecyclerView.HORIZONTAL)网格列表:grid(2),一列展现几个,传递数值即可瀑布流列表:staggered(2),一列展现几个,传递数值即可 |
divider | 分割线 |
set | 扩展函数,泛型为加载的目标 |
addLayout | 添加列表Item展现的布局 |
bindData | 绑定数据和处理逻辑 |
getDataBinding | 获取ViewDataBinding |
getModel | 获取数据目标 |
setOnItemClickListener | 条目点击事情 |
setList | 设置列表数据 |
有的老铁可能会问了,封装之后简略是简略了,可是假如遇到杂乱列表,都写到一个类里,代码量实在是太多了,哎!这确实是 个问题,可是呢,又不是问题,假如bindData里的逻辑比较多,你完结能够抽取到其他地方,比方ViewModel里,在ViewModel界说 办法后,调用即可,又或许呢,运用后边的DataBinding。
3、多条目列表加载
效果图能够疏忽,重在功用哈~,多条目加载也封装了,有适配器和无适配办法,在实践的事务开发中,我们能够挑选性进行运用。
有适配器办法
也便是和传统的多条目保持共同,都在适配器里进行数据的烘托和逻辑处理。
仍是那句话,多条意图适配器也抽取了基类,既然都有基类了,为了代码上的简洁,主张仍是承继基类比较好。
怎么添加多条目?
直接在构造办法里,调用addLayout即可,有几个多条目就添加几个,是不是十分的方便,泛型为数据目标,参数为多条目xml布局。
怎么数据烘托和逻辑处理?
完结bindOperation办法即可,通过holder.itemViewType来却分多条意图类型,当然了这个有必要和数据目标里的类型保持共同。
区别多条目类型
数据目标完结BaseMultipleItem,重写itemViewType特点,itemViewType便是用来区别多条目类型的,能够随意设置,或许是接口的某个参数,或许是对应的layout。
class OrdinaryMultipleItemAdapter : BaseMultipleItemAdapter {
constructor() {
//添加多条目类型以及绑定的数据目标
addLayout<MultipleItem01Bean>(R.layout.layout_ordinary_multiple_01)
addLayout<MultipleItem02Bean>(R.layout.layout_ordinary_multiple_02)
addLayout<MultipleItem03Bean>(R.layout.layout_ordinary_multiple_03)
}
override fun bindOperation(holder: BaseViewHolder, t: BaseMultipleItem?, position: Int) {
when (holder.itemViewType) {
1 -> {
val bean = t as MultipleItem01Bean
holder.setText(R.id.tv_title, bean.title!!)
holder.setText(R.id.tv_desc, bean.desc!!)
val ivPic = holder.findView<ImageView>(R.id.iv_pic)
ivPic.setImageDrawable(bean.icon)
}
2 -> {
val bean = t as MultipleItem02Bean
val ivPic01 = holder.findView<ImageView>(R.id.iv_01)
val ivPic02 = holder.findView<ImageView>(R.id.iv_02)
val ivPic03 = holder.findView<ImageView>(R.id.iv_03)
ivPic01.setImageDrawable(bean.icon01)
ivPic02.setImageDrawable(bean.icon02)
ivPic03.setImageDrawable(bean.icon03)
}
3 -> {
val bean = t as MultipleItem03Bean
holder.setText(R.id.tv_content, bean.content!!)
}
}
}
}
设置布局管理器和适配器
val adapter = OrdinaryMultipleItemAdapter()
mBinding.recycler.linear()
.divider().adapter = adapter
adapter.setList(getMoreList())
无适配器办法
无适配器办法,愈加的简略,只需求调用setMore办法即可,有多少条目就调用addLayout几次,在bindData里进行数据烘托和逻辑处理,当然了,也能够运用DataBinding办法,需求追加BR。
mBinding.recycler.linear()
.divider()
.setMore {
addLayout<MultipleItem01Bean>(R.layout.layout_multiple_01, BR.multiple1)
addLayout<MultipleItem02Bean>(R.layout.layout_multiple_02, BR.multiple2)
addLayout<MultipleItem03Bean>(R.layout.layout_multiple_03, BR.multiple3)
bindData {
}
}.setList(getMoreList())
4、DataBinding办法列表加载
DataBinding的呈现,使得数据绑定愈加的简略化,大大减少了代码的书写,我们能够选用供给的两种办法进行运用,一种是针对Item的绑定,一种是对RecyclerView本身的绑定。
Item绑定
第一步,addLayout,添加和xml绑定的BR
mBinding.recycler.linear().divider()
.set<OrdinaryListBean> {
addLayout(R.layout.layout_ordinary_bind_item, BR.ordinary)
setOnItemViewClickListener { view, position ->
//条目点击事情
Toast.makeText(requireContext(), "当时点击条目为:$position", Toast.LENGTH_SHORT).show()
}
}.setList(getList())
第二步,xml数据绑定
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="ordinary"
type="com.abner.list.ordinary.OrdinaryListBean" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="@dimen/vip_dp_80"
android:paddingLeft="@dimen/vip_dp_20"
android:paddingRight="@dimen/vip_dp_20">
<ImageView
android:id="@+id/iv_pic"
android:layout_width="@dimen/vip_dp_60"
android:layout_height="@dimen/vip_dp_60"
android:src="@mipmap/vip_list_logo"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/vip_dp_10"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/iv_pic"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{ordinary.title}"
android:textColor="#222222"
android:textSize="@dimen/vip_sp_16" />
<TextView
android:id="@+id/tv_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/vip_dp_10"
android:text="@{ordinary.desc}"
android:textColor="#666666"
android:textSize="@dimen/vip_sp_14" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
RecyclerView绑定
第一步,xml中RecyclerView数据绑定
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="model"
type="com.abner.list.bind.RecyclerViewBindViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler"
listData="@{model.list}"
listLayout="@{model.layoutId}"
listManager="@{0}"
listVariableName="@{model.listVariableName}"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
第二步、对应model中供给数据
class RecyclerViewBindViewModel : BaseViewModel() {
val layoutId = R.layout.layout_ordinary_bind_item//item列表
/**
* AUTHOR:AbnerMing
* INTRODUCE:获取视图绑定的name
*/
fun getListVariableName(): Int {
return BR.ordinary
}
/**
* AUTHOR:AbnerMing
* INTRODUCE:模拟数据
*/
fun getList(): MutableList<OrdinaryListBean> {
return mutableListOf<OrdinaryListBean>().apply {
for (a in 0..20) {
val bean = OrdinaryListBean()
bean.title = "我是标题$a"
bean.desc = "我是描绘信息$a"
bean.icon = R.mipmap.vip_list_logo
add(bean)
}
}
}
}
特点一览
特点 | 类型 | 概述 |
---|---|---|
listManager | Int | 布局管理器:默以为纵向的一般列表。0:一般列表1:网格2:瀑布流 |
listOrientation | Int | 设置列表方向,默许纵向。横向:RecyclerView.HORIZONTAL |
listSpanCount | Int | 展现几列,适用于网格和瀑布流 |
isDivider | Boolean | 是否展现分割线 |
dividerDrawable | Int | 分割线样式 |
listLayout | Int | Item布局 |
listData | MutableList<T> | 数据 |
listVariableName | Int | 绑定的BR |
listAdapter | OnAdapterListener<T> | 回来适配器,能够通过这儿完结,适配器中的逻辑处理 |
isMultiple | Boolean | 是否是多条目 |
multipleAdapter | OnAdapterMultipleListener | 回来多条目适配器 |
multipleData | MutableList<BaseMultipleItem> | 多条目数据 |
multipleLayout | MutableList<Int> | 多条目布局 |
multipleLayoutBindData | MutableList<Class<*>> | layout绑定的数据目标 |
multipleVariableName | MutableList<Int> | xml绑定的对应的VariableName |
两种绑定办法,各有长处,我们能够依据实践的事务进行挑选运用。
5、设置分割线
调用divider办法即可。
mBinding.recycler.linear()
.divider()
.set<OrdinaryListBean> {
addLayout(R.layout.layout_ordinary_bind_item, BR.ordinary)
}.setList(getList())
divider可选参数如下:
参数 | 类型 | 概述 |
---|---|---|
color | Int | 分割线颜色,默许是#cccccc |
orientation | Int | 分割线方向,默许和纵向保持共同,RecyclerView.VERTICAL |
lineWidth | Int | 分割线的高度 |
margin | Int | 分割线距离左右或许距离上下的边距 |
hideLast | Boolean | 是否躲藏最终一条分割线 |
itemType | Int | 默以为0,不为0时,则绘制横向线条,适用于网格列表分割线 |
6、头和尾追加和删去
头和尾的添加支撑layout和View两种添加办法,代码如下所示:
mAdapter?.addHead(R.layout.layout_head)//初始 添加头 不必改写
mAdapter?.addFoot(R.layout.layout_foot)//初始 添加尾 不必改写
后续假如动态添加头尾,需求更新适配器。
mAdapter?.addHead(view, true)//追加头,需求改写
mAdapter?.addFoot(view, true)//追加尾,需求改写
动态删去头尾操作,支撑依照索引进行删去。
mAdapter?.removeHead()
mAdapter?.removeFooter()
7、数据追加和删去
初始添加数据
mAdapter?.setList(getList())
追加数据,支撑目标和集合两种办法
mAdapter?.addData()
删去数据
mAdapter?.removeData(0)
8、设置缺省页面
缺省页面没什么好说的,数据为空或许数据加载过错的时分,设置一张占位View。
空页面,调用addEmptyView即可,支撑layout和View两种办法,过错页面,调用addErrorView,和空页面运用办法共同。
mAdapter = mBinding.recycler.linear()
.divider()
.set {
addEmptyView(R.layout.layout_empty)//初始化 空页面
addErrorView(R.layout.layout_error)//初始化 过错页面
addLayout(R.layout.layout_item, BR.str)
}
//初始添加数据
mAdapter?.setList(getList())
功用 | 完结 |
---|---|
显现空 | mAdapter?.showEmptyView() |
躲藏空 | mAdapter?.hintEmptyView() |
显现过错 | mAdapter?.showErrorView() |
躲藏过错 | mAdapter?.hintErrorView() |
9、拖拽排序功用
调用drag办法即可完结拖拽排序功用。
mBinding.recycler.linear()
.drag()//支撑拖拽
.set<DragBean> {
addLayout(R.layout.layout_drag_item, BR.drag)
}.setList(getList())
留意事项
传递的数据目标有必要完结BaseNoDragBean,需求重写isDrag特点,false为制止拖拽,true为允许拖拽。
class DragBean : BaseNoDragBean {
override var isDrag = false
var content = ""
}
10、侧滑删去条目
调用slideDelete办法即可,支撑左右侧滑删去,传递不同的值即可。
mBinding.recycler
.linear()
.slideDelete()//支撑侧滑删去 默许是左滑删去 0是右边 1是左右两头
.set<String> {
addLayout(R.layout.layout_main_item, BR.str)
}.setList(getList())
11、侧滑显现按钮
由原来的set办法改为setSlide办法即可。
mBinding.recycler
.linear()
.divider()
.setSlide<String> {//假如要显现按钮 运用 setSlide
addLayout(R.layout.layout_item)
bindData {
val model = getModel(adapterPosition)
setText(R.id.tv_content, model)
}
}.setList(getList())
有的老铁可能会问,我想展现多个按钮,或许展现自界说的View,怎么完结呢?在setSlide调用addSlideLayout,传入自己的xml布局即可。
12、条目吸顶功用
完结吸顶就调用stick办法即可。
mBinding.recycler.linear()
.stick()
.set<StickHeaderBean> {
addLayout(R.layout.layout_stick_item, BR.stick)
}.setList(getList())
需求留意,数据目标需求完结StickHeaderBean,重写分组标识。
class StickHeaderBean : BaseStickHeaderBean {
override var stickGroup: String = ""//分组标识
var name = ""//一般内容
}
13、单选、多选、全选、反选
当然了这都是事务层的逻辑,按理来说,没必要在封装,可是考虑到代码的简洁性,单选和多选的判别逻辑就封装了一下,我们如有用到此功用,可依照如下的办法进行操作即可。
单选
主要的就两部分:
1、开启单选改写
mNotifySingleChoice=true
2、判别单选
adapterPosition==mCheckPosition,能够利用mCheckPosition来判别,从而更新UI。
mBinding.recycler.linear().divider().set<SingleBean> {
mNotifySingleChoice = true//开启单选改写
addLayout(R.layout.layout_single_choice_list_item, BR.single)
bindData {
val binding = this.getDataBinding<LayoutSingleChoiceListItemBinding>()
//判别单选,直接判别 adapterPosition == mCheckPosition 即可
binding?.checkbox?.isChecked = adapterPosition == mCheckPosition
setOnItemViewClickListener { view, position ->
//条目点击
val singleBean = getList()[position]//单选 挑选的目标
mViewModel.name.set(singleBean.name)
}
}
}.setList(getList())
多选
和单选相同,也是两部分
1、设置多选更新
mNotifyMultipleChoice=true
2、多选回调监听
setOnMultipleChoiceListener{}
mBinding.recycler.linear().divider().set<MultipleBean> {
mNotifyMultipleChoice = true//多选更新
addLayout(R.layout.layout_multiple_choice_list_item, BR.multiple)
bindData {
//多选回调监听
setOnMultipleChoiceListener {
var allPrice = 0.0f
it.forEach {
allPrice += it.price
}
mViewModel.commodityNumber.set("挑选产品数量为:" + it.size)
mViewModel.allPrice.set("总价格为:$allPrice")
}
}
}.setList(getList())
14、上拉改写和下拉加载
改写和加载运用的是SmartRefreshLayout这个开源框架,究竟现已有很优秀的框架了,没必要再从头封装一个,详细的用法,我们能够依照SmartRefreshLayout的文档去操作运用就行。
支撑大局设置下拉和上拉展现View,只需求在Application里初始化即可。
//上拉加载和下拉改写,初始化头和尾
ListConfig.apply {
addRefreshHeader {
ClassicsHeader(it)
}
addRefreshFooter {
ClassicsFooter(it)
}
}
这儿也简略举个例子:
1、xml中引进
<com.abner.refresh.kernel.SmartRefreshLayout
android:id="@+id/srl_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.abner.refresh.kernel.SmartRefreshLayout>
2、代码简略运用
mSmartRefreshLayout?.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener {
override fun onRefresh(refreshLayout: RefreshLayout) {
}
override fun onLoadMore(refreshLayout: RefreshLayout) {
}
})
当然了,为了更好的拓宽运用,针对SmartRefreshLayout,又简略做了一层包装,别无他意,便是为了让运用愈加的简略。
1、xml里引进PageRefreshLayout
<com.abner.relist.PageRefreshLayout
android:id="@+id/refresh"
android:layout_width="match_parent"
android:layout_height="match_parent" />
2、代码里运用
mBinding.refresh.getRecycler().linear()
.divider()
.set<String> {
addLayout(R.layout.layout_item, BR.str)
}
//改写和加载
mBinding.refresh.refresh { isRefresh, refreshLayout ->
mViewModel.doHttp {
addData(it)
}
}.autoRefresh()
直接调用refresh办法即可,isRefresh为true是下拉,不然便是上拉,十分的方便,而addData办法,则完结了分页加载数据,上拉和下拉直接调用addData即可。
PageRefreshLayout可调用办法如下
办法 | 参数 | 概述 |
---|---|---|
autoRefresh | 无参 | 主动改写操作 |
refresh | 无参 | 静默改写(不带下拉改写动画) |
addData | Collection<T> | 添加数据,分页会主动追加数据,下拉和上拉会主动关闭 |
setEnableRefresh | Boolean | 是否制止下拉 |
setEnableLoadMore | Boolean | 是否制止上拉 |
finishRefresh | 无参 | 关闭下拉改写 |
finishLoadMore | 无参 | 关闭上拉改写 |
getPager | 无参 | 获取当时页码 |
refresh | 回调函数 | 改写和加载办法 |
getSmartRefresh | 无参 | 获取SmartRefreshLayout |
getRecycler | 无参 | 获取RecyclerView |
addEmptyView | Int/View | 添加空的布局,支撑layout和View |
addErrorView | Int/View | 添加过错的布局,支撑layout和View |
showEmptyView | 无参 | 显现空布局 |
showErrorView | 无参 | 显现过错布局 |
hintEmptyView | 无参 | 躲藏空布局 |
hintErrorView | 无参 | 躲藏过错布局 |
setHeightWrapContent | 无参 | 设置全体的列表由充满改为包裹内容。 |
三、开源地址
关于我们在运用上的问题以及后续的优化,或许功用新增,都会时长更新,方便的话,给个小星星呗~
开源地址:github.com/AbnerMing88…
四、运用总结
1、无适配器的办法,在逻辑相对杂乱的页面,主张我们能够抽取到ViewModel中完结,当然,也能够选用DataBinding的办法。
2、很多运用办法,或许常见的事务开发场景,在文档中或许源码中,都会详细的备注,我们能够仔细的查看即可。
3、条目点击事情,给出了两个,我们能够挑选性运用。
只回来索引
setOnItemClickListener {
}
当时点击的View和索引。
setOnItemViewClickListener { view, position ->
}
五、后续规划
此库的封装,除了改写加载库运用了SmartRefreshLayout,其他的都是自己从0到1的开发,现在,自己现已在项目中运用,暂时没有呈现任何问题,当然了,后续,也会不断的对其进行优化,添加一些其他的功用,期望有需求的小伙伴,长期重视。
关于保护上,不断的优化和处理一些我们所提的问题。
关于源码上,后续会逐一分析其完结办法,确确实实,里边用到了一些特殊技术,当然了,这都是后话了。