大佬,用常规方式没问题,但是我这么写居然不行,没太明白~
xuehao0217 opened this issue · 2 comments
xuehao0217 commented
fun <T, VB : ViewBinding> RecyclerView.onBindAdapter(itemBind: (BaseBindingQuickAdapter.BaseBindingHolder, T) -> Unit){
val bindingAdapter by lazy {
object :BaseBindingQuickAdapter<T, VB >(){
override fun convert(holder: BaseBindingHolder, item: T) {
itemBind.invoke(holder,item)
}
}
}
this.adapter=bindingAdapter
}
DylanCaiCoding commented
要用内敛才能找到泛型,加上 inline 就可以了。我按照你的思路帮你把代码优化了:
inline fun <VB : ViewBinding, T> RecyclerView.onBindAdapter(crossinline convert: VB.(T) -> Unit) =
object : BaseBindingQuickAdapter<T, VB>() {
override fun convert(holder: BaseBindingHolder, item: T) {
convert(holder.getViewBinding(), item)
}
}.also {
adapter = it
}
binding.recyclerView
.onBindAdapter<ItemFooBinding, String> { item ->
textView.text = item
}
.data.addAll(list)
下面也提供一个我个人的封装思路:
inline fun <VB : ViewBinding, T> baseQuickAdapter(crossinline convert: VB.(T) -> Unit) =
object : BaseBindingQuickAdapter<T, VB>() {
override fun convert(holder: BaseBindingHolder, item: T) {
convert(holder.getViewBinding(), item)
}
}
用法:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
adapter.data.addAll(list)
binding.recyclerView.adapter = adapter
}
private val adapter = baseQuickAdapter<ItemFooBinding, String> { item ->
textView.text = item
}
xuehao0217 commented
感谢~!受教了~!