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

如何在Kotlin的RecyclerView中编辑字符串与列表:数字变色、删特殊符号

RecyclerView中实现数字变色与符号移除的正确姿势

直接在Activity里写处理逻辑没法作用到RecyclerView的每个Item上,得把文本处理逻辑放到Adapter的onBindViewHolder方法里,针对每个Item的TextView单独处理。下面是具体实现:

1. 移除自定义符号

用正则表达式一次性替换所有需要移除的符号,比多次调用replace更简洁高效:

fun removeSpecialSymbols(text: String): String {
    // 匹配要移除的符号,这里包含, ; ',可按需添加
    return text.replace("[,;']".toRegex(), "")
}

2. 为数字设置红色

用正则替换的方式一次性给所有数字加上颜色标签,同时注意Android版本兼容的Html解析方式:

fun colorizeDigits(text: String): CharSequence {
    val coloredText = "\\d+".toRegex().replace(text) { match ->
        "<font color='#FF0000'>${match.value}</font>"
    }
    // 适配Android N及以上版本
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Html.fromHtml(coloredText, Html.FROM_HTML_MODE_LEGACY)
    } else {
        @Suppress("DEPRECATION")
        Html.fromHtml(coloredText)
    }
}

3. 整合到RecyclerView Adapter里

在Adapter的onBindViewHolder中,先处理符号移除,再处理数字变色,最后赋值给TextView:

class MyAdapter(private val dataList: List<String>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val itemTextView: TextView = itemView.findViewById(R.id.item_tv)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_layout, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val originalText = dataList[position]
        // 第一步:移除符号
        val textWithoutSymbols = removeSpecialSymbols(originalText)
        // 第二步:数字变色
        val finalText = colorizeDigits(textWithoutSymbols)
        // 赋值给TextView
        holder.itemTextView.text = finalText
    }

    override fun getItemCount(): Int = dataList.size

    // 工具函数可放在Adapter内部或单独工具类中
    private fun removeSpecialSymbols(text: String): String {
        return text.replace("[,;']".toRegex(), "")
    }

    private fun colorizeDigits(text: String): CharSequence {
        val coloredText = "\\d+".toRegex().replace(text) { match ->
            "<font color='#FF0000'>${match.value}</font>"
        }
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Html.fromHtml(coloredText, Html.FROM_HTML_MODE_LEGACY)
        } else {
            @Suppress("DEPRECATION")
            Html.fromHtml(coloredText)
        }
    }
}

原代码无效的原因

你的代码是直接操作Activity里的单个TextView,而RecyclerView的每个Item都是独立复用的视图,必须在绑定每个Item时针对当前文本做处理,才能让所有Item都应用效果。

另外原数字变色代码存在两个问题:

  • flatMap { it.groupValues }会拆分匹配到的数字组,导致重复替换(比如匹配到"123"后,还会单独处理"1""2""3")
  • 未处理Android版本兼容的Html解析逻辑,高版本系统可能无法正确渲染颜色

内容的提问来源于stack exchange,提问作者User_Michel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:35:49