打开ViewBinding开关
viewBinding {
enabled = true
}
在Activity中使用ViewBinding
class MainActivity : AppCompatActivity() {
private lateinit var mainViewBinding : ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mainViewBinding = ActivityMainBinding.inflate(LayoutInflater.from(this))
setContentView(mainViewBinding.root)
val translation = supportFragmentManager.beginTransaction()
translation.replace(R.id.main_container,MainFragment())
translation.commit()
}
}
在Fragment中使用ViewBinding
class MainFragment : Fragment() {
private lateinit var mainViewBinding : FragmentMainBinding
private var mainTitleAdapter : MainTitleAdapter ?= null
private val titleList = mutableListOf("Activity-Fragment-协同ViewModel")
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
mainViewBinding = FragmentMainBinding.inflate(LayoutInflater.from(context),container,false)
return mainViewBinding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initTitleList()
}
private fun initTitleList() {
mainTitleAdapter = MainTitleAdapter()
mainViewBinding.rvTitleContainer.layoutManager = LinearLayoutManager(context)
mainViewBinding.rvTitleContainer.adapter = mainTitleAdapter
mainTitleAdapter?.setDataList(titleList)
mainTitleAdapter?.setOnItemClickListener { view,posiotn ->
}
}
}
在Adapter中使用Binding
1.首先创建一个BaseRecyclerAdapter,这里在以后的学习中一直添加优化
abstract class BaseRecyclerAdapter<T, VH : RecyclerView.ViewHolder> : RecyclerView.Adapter<VH>() {
private var dataList = mutableListOf<T>()
fun setDataList(dataList: MutableList<T>?) {
if (dataList != null) {
this.dataList.addAll(dataList)
}
notifyDataSetChanged()
}
fun getDataList(): MutableList<T> {
return dataList
}
fun clearDataList() {
dataList.clear()
}
fun addData(dataList: MutableList<T>?) {
dataList?.let { list ->
this.dataList.addAll(dataList)
notifyItemRangeInserted(this.dataList.size.minus(list.size), itemCount)
}
}
override fun getItemCount(): Int {
return dataList?.size ?: 0
}
}
2.做一个支持ViewBinding的通用Adapter,这里仅支持单布局样式
abstract class BaseRecyclerHolderAdapter<T, VB : ViewBinding> : BaseRecyclerAdapter<T, BaseRecyclerHolderAdapter.BaseViewHolder<VB>>() {
private var onItemClickListener: ((View, Int) -> Unit)? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<VB> {
return BaseViewHolder(onBindingView(parent))
}
override fun onBindViewHolder(holder: BaseViewHolder<VB>, position: Int) {
onBindingData(holder, getDataList()[position], position)
holder.itemView.setOnClickListener { view ->
onItemClickListener?.invoke(view, position)
}
}
protected abstract fun onBindingView(parent: ViewGroup): VB
protected abstract fun onBindingData(holder: BaseViewHolder<VB>, item: T, position: Int)
fun setOnItemClickListener(block: (View, Int) -> Unit) {
this.onItemClickListener = block
}
class BaseViewHolder<VB : ViewBinding>(val viewBinding: VB) : RecyclerView.ViewHolder(viewBinding.root) {}
}
3.简单的只有一个TextView的Adapter
class MainTitleAdapter : BaseRecyclerHolderAdapter<String, ItemTitleBinding>() {
override fun onBindingView(parent: ViewGroup): ItemTitleBinding {
return ItemTitleBinding.inflate(LayoutInflater.from(parent.context),parent,false)
}
override fun onBindingData(holder: BaseViewHolder<ItemTitleBinding>, item : String, position: Int) {
holder.viewBinding.tvTitle.text = item
}
}
布局文件就不贴出,只是简单的Layout,Binding文件是根据布局文件的名称系统自动生成的,如fragment_main.xml,在系统就回生成FragmentMainBindig这个ViewBinding类,直接引用.