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

Android TextView加载HTML有序列表显示为圆点无序列表问题求助

问题核心原因

Android 原生HtmlCompat的默认标签解析器对<ol>有序列表的支持存在原生缺陷,所有<li>标签无论父节点是有序列表还是无序列表,默认都会统一渲染为圆点前缀,不会自动生成递增的数字序号,这是渲染效果不符合预期的根本原因。

修复方案
  • 自定义Html.TagHandler实现,单独处理<ol>和<li>标签的序号计数逻辑,覆盖系统默认的列表渲染规则
  • 调用HtmlCompat.fromHtml方法时,将自定义TagHandler作为参数传入

核心实现代码

1. 自定义有序列表标签处理器

import android.text.Editable
import android.text.Html
import org.xml.sax.XMLReader
import java.util.Stack

class OrderedListTagHandler : Html.TagHandler {
    private var olLevel = 0
    private val indexStack = Stack<Int>()

    override fun handleTag(
        opening: Boolean,
        tag: String,
        output: Editable,
        xmlReader: XMLReader
    ) {
        when (tag.lowercase()) {
            "ol" -> {
                if (opening) {
                    olLevel += 1
                    indexStack.push(1)
                } else {
                    olLevel -= 1
                    indexStack.pop()
                }
            }
            "li" -> {
                if (opening) {
                    if (olLevel > 0) {
                        val currentNum = indexStack.peek()
                        output.append("$currentNum. ")
                        indexStack.push(indexStack.pop() + 1)
                    } else {
                        output.append("• ")
                    }
                } else {
                    output.append("\n")
                }
            }
        }
    }
}

2. 修改HtmlCompat调用逻辑

dataBinding.tvBody.text = HtmlCompat.fromHtml(
    text,
    HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_DIV,
    null,
    OrderedListTagHandler()
)

上述实现可直接覆盖当前传入的单层有序列表场景,渲染后会自动生成1.、2.、3.、4.格式的序号前缀。如果存在多层嵌套列表需求,可在处理器中新增<ul>层级计数逻辑,按需区分不同层级的序号、前缀样式即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:51:23