RecyclerView 实现多种 item 的布局
在项目中列表是基本都会用到的,然而在显示列表时,我们需要的数据可能需要不止一种item显示,对于复杂的数据就需要多种item,以不同的样式显示出来,这样效果是很棒的。
在 RecyclerView 中要实现多种 item 的布局,我们可以重写方法getItemViewType(),这个方法会传进一个参数position表示当前是第几个Item,然后我们可以通过position拿到当前的Item对象,然后判断这个item对象需要那种视图,返回一个int类型的视图标志,然后在onCreatViewHolder方法中给引入布局,这样就能够实现多种item显示了。
例如:
override fun getItemViewType(position: Int): Int {
if(items.size <= position){
return EMPTY_ITEM
}else{
return NORMAL_ITEM
}
}
这里我们重写了 getItemViewType 方法,在这个方法中根据 position 对 item 对象做出一些条件判断,例子中的场景是,倘若滑到了最后一项,将 ViewType 设置为 EMPTY_ITEM ,显示加载的 Item 的布局,否则就是正常的布局。一共两种布局样式 。
然后,根据不同的 viewType 重写 onCreatViewHolder 方法,在其中为每一种类型引入其布局。
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int):RecyclerView.ViewHolder{
if (viewType == EMPTY_ITEM) {
val binding = LayoutIntercomRecordItemSlideRecyclerEmptyViewBinding.inflate(LayoutInflater.from(parent.context),parent,false)
return EmptyItemViewHolder(binding)
} else {
val binding = LayoutIntercomRecordItemSlideRecyclerViewBinding.inflate(LayoutInflater.from(parent.context),parent,false)
return NormalItemViewHolder(binding)
}
}
上面的代码就是具体为每种viewType引入其对应的布局,这样就基本实现了多种item布局,但是仅仅是这些还不够,因为我们还要对每种item设置数据,所以还要对每种item写一个VIewHolder来为item显示数据。
class NormalItemViewHolder(val itemViewBinding : LayoutIntercomRecordItemSlideRecyclerViewBinding) : RecyclerView.ViewHolder(itemViewBinding.root)
class EmptyItemViewHolder(val itemViewBinding: LayoutIntercomRecordItemSlideRecyclerEmptyViewBinding) : RecyclerView.ViewHolder(itemViewBinding.root)
整个过程基本就是这样,这种方式在项目中经常会用到,我们就可以这样去处理,下拉加载更多就可以这样实现,在加载完数据后再往对象集合中传入null,然后判断如果出现null就加载progressBar 布局,再加上Google官方的SwipeRefreshLayout,下拉刷新,上拉加载就搞定了,其实很容易。