![](/img/trans.png)
[英]What is a view model and how can I use it to replace findViewById with View Binding and
[英]How can i change findViewById to view binding?
這是我的適配器代碼;
class ModelViewHolder(view: View) : RecyclerView.ViewHolder(view) {
private val chName: TextView = view.findViewById(R.id.chName)
private val chBirthYear: TextView = view.findViewById(R.id.chBirthYear)
private val chHeight: TextView = view.findViewById(R.id.chHeight)
private val chHomeWorld: TextView = view.findViewById(R.id.chHomeWorld)
獲取列表項視圖綁定 class 並將其更改為:
//ItemModelBinding is the generated binding class for the list view item
class ModelViewHolder(val binding: ItemModelBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: SomeModelClass) {
binding.chName = item.chName
binding.chBirthYear = item.chBirthYear
binding.chHeight = item.chHeight
binding.chHomeWorld= item.chHomeWorld
binding.executePendingBindings()
}
override fun onBindViewHolder(holder: ModelViewHolder, position: Int) {
val item = getItem(position)
holder.bind(item)
}
class ModelViewHolder(view: View) RecyclerView.ViewHolder(view){
val binding = LayoutYouWantToUseBinding.bind(view)
}
ListAdapter是 RecyclerView.Adapter 基礎 class 用於在 RecyclerView 中呈現 List 數據,包括在后台線程上計算 List 之間的差異。
DiffUtil有助於計算后台線程上兩個列表之間的差異。 並且僅更新數據已更改的視圖意味着onBindViewHolder()的調用次數減少,如果我們仍然堅持在任何數據更改時使用notifyDataSetChanged () ,這將調用所有項目。
class ModelAdapter : ListAdapter<Model, ModelAdapter.ModelViewHolder>(ModelDiffCallBack()) {
class ModelViewHolder(private val binding: ModelItemLayoutBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(model: Model) {
//if data binding is also enabled
binding.model = model
//else set data for each view one after another
binding.txtTitle.text = model.title
//and so on for all the items
binding.executePendingBindings()
}
companion object {
fun from(parent: ViewGroup): ModelViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val binding = ModelItemLayoutBinding.inflate(layoutInflater, parent, false)
return ModelViewHolder(binding)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ModelViewHolder =
ModelViewHolder.from(parent)
override fun onBindViewHolder(holder: ModelViewHolder, position: Int) {
val model = getItem(position)
holder.bind(model)
}
class ModelDiffCallBack : DiffUtil.ItemCallback<Model>() {
override fun areItemsTheSame(oldItem: Model, newItem: Model): Boolean =
oldItem === newItem
override fun areContentsTheSame(oldItem: Model, newItem: Model): Boolean =
oldItem == newItem
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.