【问题标题】:What might be the best way to load list of HTML content on android?在 android 上加载 HTML 内容列表的最佳方式可能是什么?
【发布时间】:2021-10-31 14:04:22
【问题描述】:

我正在尝试使用 recyclerView 在我的应用程序上加载带有 html 标记(HTML 内容)的字符串列表。到目前为止,我已经尝试在 recyclerView 视图上使用 Html.fromHtml() 方法,但找不到任何运气,因为它只支持有限的 HTML 标签。

Html.fromHtml 支持:

  • p
  • ul
  • 李
  • div
  • 跨度
  • 强
  • b
  • em
  • 引用
  • dfn
  • 我
  • 大
  • 小
  • 字体
  • 块引用
  • tt
  • 一个
  • 你
  • 德尔
  • s
  • 罢工
  • 支持
  • 分
  • h1
  • h2
  • h3
  • h4
  • h5
  • h6
  • img
  • br

我需要解析的是那些 Html.fromHtml 不支持的标签,例如项目符号、内联 CSS

所以我决定在 WebView 上加载内容。我知道将 WebView 实现为 recyclerView 项不是一个好习惯,但我找不到任何替代解决方案。

是否有任何机制可以让我获得可靠的解决方案。由于 recyclerview 中的 webview 存在许多问题,例如滚动问题、异步内容加载等。 请帮助我如何才能在这件事上顺利滚动。

到目前为止,我已经这样做了

class MessageViewHolder internal constructor(itemView: View) :  RecyclerView.ViewHolder(itemView) ,ViewHolderBinder{
private var webView: WebView? = itemView.findViewById(R.id.ac_web_view)

override fun bind(position: Int) {
    super.bind(position)
    loadContentOnWebView(message) // html content
}

private fun loadContentOnWebView( message: String) {
    webView?.apply { 
        isVerticalScrollBarEnabled = false
        settings.javaScriptEnabled = true
        setLayerType(View.LAYER_TYPE_HARDWARE, null)
        webViewClient = object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
                view.context.startActivity(
                    Intent(Intent.ACTION_VIEW, Uri.parse(url))
                )
                return true
            }
        }
        loadDataWithBaseURL(null, message.changeHtmlLinkColor(), "text/html", "UTF-8", null)
    }
}

}

【问题讨论】:

  • 为什么不用JSoup HTML解析器来获取带有目标url的html标签?
  • 汤?或者,如果您需要,请尝试某种形式的抓取或公开 API 以从您的网站获取数据
  • 我没有通过 URL 加载内容

标签: android android-recyclerview webview android-webview


【解决方案1】:

如果你只需要设置字符串,你只需要在你的 ViewHolder 类中使用 Html.fromHtml() (不需要只为文本添加 webview),在你的 ViewHolder 类中添加这个代码,也许它可以工作!

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    view.text = Html.fromHtml("your HTML String", Html.FROM_HTML_MODE_COMPACT)
} else {
    view.text = Html.fromHtml("your HTML String")
}

【讨论】:

  • 他在代码中已经提到有些标签不支持这种方式
  • 他还需要在代码中提到那个标签,还要检查他使用Html.toHtml()而不是Html.fromHtml(),也许你必须非常仔细地阅读代码! @gtxtreme
猜你喜欢
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
相关资源
最近更新 更多