在公司的技术分享会上,整理的笔记:
#1. 不良做法:
1. RecyclerView.Adapter 或 ListAdapter (Adapter KodeinAware) 中的依赖注入
2. ViewHolder 中的依赖注入(ViewHolder KodeinAware)
3. 在所有情况下都使用 notifyDatasetChanged()。
4. 在 RecyclerAdapter、ListAdapter 或 ViewHolder 中实现业务逻辑
#2.良好做法:
1. 尽可能使用 recyclerView.setHasFixedSize(true)。
2. 使用 ConstraintLayout 进行项目布局。
3. 使用侦听器附加点击处理程序。
4. 建议使用 ListAdapter,而不仅仅是 RecyclerView.Adapter。
5. 如果你使用 RecyclerView.Adapter 也要使用 DiffUtil。
6. 不要过度设计,如果回收器视图很简单并且您永远不会更新它,只需使用简单的 RecyclerView.Adapter。
示例代码:
/**
* Adapter for the [RecyclerView] in [PlantListFragment].
*/
class PlantAdapter(callback: AdapterCallback?) : ListAdapter<Plant, RecyclerView.ViewHolder>(PlantDiffCallback()) {
interface AdapterCallback {
fun navigateToPlant(
plant: Plant,
view: View
)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return PlantViewHolder(
ListItemPlantBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val plant = getItem(position)
(holder as PlantViewHolder).bind(plant)
}
inner class PlantViewHolder(
private val binding: ListItemPlantBinding
) : RecyclerView.ViewHolder(binding.root) {
init {
binding.setClickListener {
binding.plant?.let { plant ->
adapterCallback?.navigateToPlant(plant, it)
}
}
}
fun bind(item: Plant) {
binding.apply {
plant = item
executePendingBindings()
}
}
}
}
private class PlantDiffCallback : DiffUtil.ItemCallback<Plant>() {
override fun areItemsTheSame(oldItem: Plant, newItem: Plant): Boolean {
return oldItem.plantId == newItem.plantId
}
override fun areContentsTheSame(oldItem: Plant, newItem: Plant): Boolean {
return oldItem == newItem
}
}
(欢迎讨论~)
相关文档 :使用 RecyclerView 创建动态列表