You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:03:29