RecyclerView.Adapter
当前最新版本号:
- 辅助android开发者快速创建RecyclerView.Adapter的实现。
- 对于已引入ViewBinding和DataBinding的项目极其友好,仅需要2-5行代码。
- 提供DataBinding、ViewBinding配合普通列表及Paging3的各种适配器,可以满足各种需求。
在数据类上实现Identifiable接口
data class Item(val id: Int, val name: String): Identifiable<Int> {
override val identity: Int
get() = id
}
DataBinding
- 如果使用DataBinding,仅需声明一个Adapter,即可完成创建工作。
class ItemAdapter : AutomaticBindingAdapter<Item, ItemBinding>()
val itemAdapter = ItemAdapter()
recyclerView.adapter = itemAdapter
itemListViewModel.itemListLiveData.observe(this) { list ->
itemAdapter.submitList(list)
}
itemAdapter.clickEvent.observe(this) { (view: View, item: Item) ->
}
itemAdapter.clickItemEvent.observe(this) { item: Item ->
}
ViewBinding
- 当AutomaticBindingAdapter无法满足需求时,可使用MutableBindingAdapter + ViewBindingHolder
class ItemAdapter : MutableBindingAdapter<Item, ItemBinding, ItemHolder>(::ItemHolder)
class ItemHolder(binding: ItemBinding) : ViewBindingHolder<Item, ItemBinding>(binding) {
init {
binding.root.setOnClickListener {
val item = list.getItem(layoutPosition)
}
}
override fun binding(position: Int) {
binding.textView.text = list.getItem(position).toString()
}
}
val itemAdapter = ItemAdapter()
recyclerView.adapter = itemAdapter
itemListViewModel.itemListLiveData.observe(this) { list ->
itemAdapter.submitList(list)
}
List表头表尾占位
- 偶尔会遇到需要在RecyclerView中开始或结束的位置上显示一些固定的内容的需求,此时Adapter的getItemCount与List的size并不相等,当列表的数据发生变化时,会出现RecyclerView的动画不正常,加载不正确等问题,这里也可以提供解决方案:
class ItemAdapter : AutomaticBindingAdapter<NumberItem, NumberViewBinding>() {
init {
headerCount = 2
trailCount = 3
}
override fun onCreateHeaderViewHolder(parent: ViewGroup): ViewBindingHolder<out Identifiable<*>, ViewBinding> {
return HeaderHolder(HeaderBinding.inflate(LayoutInflater.from(parent.context), parent, false))
}
override fun onCreateTrailViewHolder(parent: ViewGroup): ViewBindingHolder<out Identifiable<*>, ViewBinding> {
return TrailHolder(TrailBinding.inflate(LayoutInflater.from(parent.context), parent, false))
}
}
class HeaderHolder(binding: HeaderViewBinding): ViewBindingHolder<out Identifiable<*>, HeaderViewBinding>(binding) {
override fun binding(position: Int) {
}
}
class TrailHolder(binding: TrailViewBinding): ViewBindingHolder<out Identifiable<*>, TrailViewBinding>(binding) {
override fun binding(position: Int) {
}
}
val itemAdapter = ItemAdapter()
recyclerView.adapter = itemAdapter
itemAdapter.submitList(list)
paging3 + DataBinding
- 当使用Paging3与DataBinding时,也可以使用自动绑定功能:
class ItemAdapter : PagingAutomaticBindingAdapter<Item, ItemBinding>()
paging3 + ViewBinding
- 依旧提供便于扩展的PagingBindingAdapter
class ItemAdapter : PagingBindingAdapter<Item, ItemBinding, ItemHolder>(::ItemHolder)
引入
- 在你的android工程的根目录下的build.gradle文件中的适当的位置添加以下代码:
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
- 在你的android工程中对应的android模块的build.gradle文件中的适当位置添加以下代码:
implementation 'cn.numeron:recyclerview.adapter:latest_version'