DylanCaiCoding/ViewBindingKTX

大佬,用常规方式没问题,但是我这么写居然不行,没太明白~

xuehao0217 opened this issue · 2 comments

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
}

要用内敛才能找到泛型,加上 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
}

感谢~!受教了~!