Kotlin中如何在同一RecyclerView实现按评分区分的多类型行布局
RecyclerView 基于评分字段实现多布局行方案
核心是利用RecyclerView自带的多viewType支持,不需要引入第三方库,按以下步骤修改即可:
前置准备
- 提前做好不同等级对应的行布局文件,比如默认普通布局、评分100对应的女士红色样式布局。建议所有布局里的公共展示控件(用户名、全名、评分、等级文本)保持相同的id,减少后续绑定的重复代码。
核心代码修改
1. 修改Adapter,新增布局类型判断
首先在Adapter里定义不同布局的类型常量,重写getItemViewType方法,根据每条数据的rating值返回对应的布局类型:
class new_adapter(var post_list: List<publiks>, clickListener: Feed) : RecyclerView.Adapter<new_adapter.PostHolder>() { private var clickListener: Feed = clickListener // 定义布局类型常量 private val TYPE_NORMAL = 0 private val TYPE_LADY_RED = 1 // 其他等级的布局类型按需在这里追加 // 重写方法返回每条数据对应的布局类型 override fun getItemViewType(position: Int): Int { val currentItem = post_list[position] return when { // 按你的评分规则判断,示例为rating=100时返回红色女士布局类型 currentItem.rating == 100L -> TYPE_LADY_RED // 其他评分区间的判断逻辑写在这里,比如50~99对应其他等级布局 else -> TYPE_NORMAL } } class PostHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { init { itemView.setOnClickListener { // 原有点击逻辑保留 } } }
2. 修改onCreateViewHolder,按类型加载不同布局
把原来固定加载R.layout.rec_row的逻辑,改成根据传入的viewType加载对应布局:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostHolder { val inflater = LayoutInflater.from(parent.context) val itemView = when(viewType) { TYPE_LADY_RED -> inflater.inflate(R.layout.rec_row_lady_red, parent, false) // 其他布局类型对应的布局文件在这里追加映射 else -> inflater.inflate(R.layout.rec_row, parent, false) } return PostHolder(itemView) }
3. 数据绑定逻辑适配
你原来的onBindViewHolder逻辑基本可以直接保留,如果所有布局的公共控件id一致,直接赋值就会自动匹配当前加载布局里的对应控件:
override fun onBindViewHolder(holder: PostHolder, position: Int) { val userModel = post_list[position] holder.itemView.username.text = userModel.username holder.itemView.fullname.text = userModel.fullname holder.itemView.rating.text = userModel.rating.toString() holder.itemView.idrank.text = userModel.rank // 如果某个布局有专属控件(比如红色布局有专属徽章),在这里加viewType判断单独处理即可 // if (getItemViewType(position) == TYPE_LADY_RED) { 处理专属控件逻辑 } } }
注意事项
- 你现有Firestore拉取数据的逻辑不需要改动,目前已经正确将rating以Long类型解析并存入数据类,拉取完成后调用
notifyDataSetChanged()即可触发列表重绘,自动匹配对应布局。 - 如果不同布局的控件id不统一,不要直接调用
holder.itemView.控件id赋值,会触发空指针,要么统一所有公共控件的id,要么绑定前先判断当前viewType再找对应控件赋值。 - 后续要加新的等级样式,只需要三步:新建对应布局文件、新增viewType常量、在getItemViewType里加对应评分区间判断、在onCreateViewHolder里加布局映射即可,扩展性很好。
内容的提问来源于stack exchange,提问作者terlan abaszade
相关产品推荐
相关产品推荐

