RecyclerViews的一些做法

在公司的技术分享会上,整理的笔记:

#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 创建动态列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值