如何在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
相关产品推荐
相关产品推荐

