Kotlin中如何为RecyclerView添加顶部默认静态固定项
实现方案
核心通过为RecyclerView适配器新增多视图类型实现需求,不需要修改Firestore的数据拉取逻辑,具体修改如下:
步骤1:调整适配器逻辑
我们新增视图类型标识,同时调整条目计数、数据绑定的对应逻辑,修改后的完整代码如下:
open class CategoryListAdapter(private val context: Context, private var list: ArrayList<Categories>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { // 新增视图类型常量 private val VIEW_TYPE_TOP = 0 private val VIEW_TYPE_NORMAL = 1 // 定义顶部固定项的内容,按需修改字段即可 private val topFixedItem = Categories( category_image = "固定项图片资源/路径", category_name = "固定项展示名称" // 其他Categories类字段按需赋值 ) private var onClickListener: OnClickListener? = null // 重写视图类型判断逻辑,第一个位置返回顶部固定项类型 override fun getItemViewType(position: Int): Int { return if (position == 0) VIEW_TYPE_TOP else VIEW_TYPE_NORMAL } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { // 如果顶部固定项和普通项布局一致,无需修改此处;如果布局不同,根据viewType加载对应布局即可 return MyViewHolder( BottomsheetCategoryListLayoutBinding.inflate( LayoutInflater.from(parent.context), parent, false ) ) } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { if (holder is MyViewHolder) { if (position == 0) { // 绑定顶部固定项数据 val topModel = topFixedItem GlideLoader(context).loadPicture(topModel.category_image, holder.binding.ivCategoryImage) holder.binding.tvCategoryName.text = topModel.category_name holder.itemView.setOnClickListener { onClickListener?.onClick(0, topModel) } } else { // 普通项取原列表position-1位置的数据(第0位被固定项占用) val model = list[position - 1] GlideLoader(context).loadPicture(model.category_image, holder.binding.ivCategoryImage) holder.binding.tvCategoryName.text = model.category_name holder.itemView.setOnClickListener { // 回调原列表的真实位置,避免业务逻辑受顶部项影响 onClickListener?.onClick(position - 1, model) } } } } // 总条目数 = 顶部固定1项 + 原有Firestore拉取的列表长度 override fun getItemCount(): Int { return list.size + 1 } fun setOnClickListener(onClickListener: OnClickListener) { this.onClickListener = onClickListener } interface OnClickListener{ fun onClick(position: Int, category: Categories) } private class MyViewHolder(val binding: BottomsheetCategoryListLayoutBinding) : RecyclerView.ViewHolder(binding.root) }
步骤2:适配数据更新逻辑
你从Firestore拉取到新数据后,依然按原来的方式更新适配器的list变量,再调用刷新方法即可,顶部固定项会始终保留在第一位,不会被拉取到的数据覆盖。
可选优化:顶部项用独立布局
如果顶部固定项的布局和普通分类项不同,只需做两处修改:
- 新增顶部布局对应的ViewHolder类
- 在
onCreateViewHolder中根据viewType的值加载对应布局,返回对应的ViewHolder实例即可
内容的提问来源于stack exchange,提问作者Codist
相关产品推荐
相关产品推荐

