【问题标题】:Webview inside RecyclerView is showing blank screen sometimes on Nougat devices onlyRecyclerView 中的 Webview 有时仅在 Nougat 设备上显示空白屏幕
【发布时间】:2017-12-31 04:47:42
【问题描述】:

在我的 Nougat 设备中,RecyclerView 中的 webview 有时是空白的。当我慢慢滚动然后回到 webview 项目内容消失。在 Android N 以下的设备上没有问题。Android N 使用 Chrome 作为应用程序的默认浏览器。所以我认为 Chrome 中可能存在一个错误,所以我也在 chrome 门户中提出了一个错误。 SO中有几个相关的问题,但这并没有解决我的问题。那么Android webview设置中有没有办法可以解决这个问题?我已经在错误链接中写了详细描述。

错误链接:click here

我的WebView的onBindViewHolder方法代码是

final VHItem vhItem = (VHItem) holder;

vhItem.webViewChild.getSettings().setUseWideViewPort(false);
vhItem.webViewChild.getSettings().setJavaScriptEnabled(true);

vhItem.webViewChild.loadData("<body>" + html + "</body>", "text/html;charset=utf-8", "utf-8");

在哪里

html是html字符串

更新

他们已经解决了这个问题。如果您仍然遇到同样的问题,请尝试将您的 Android chrome 版本更新到 61 或更高版本。

【问题讨论】:

  • 你能粘贴你的onBindViewHolder()吗?或者你完成适配器
  • @DigvijaySingh 检查我编辑的问题。
  • 这个答案可能对你有帮助stackoverflow.com/a/2379054/5908465

标签: android google-chrome webview


【解决方案1】:

首先,webview 会消耗内存,因为它加载必须加载和呈现 html 数据。与其在回收站视图中使用 webview,我认为如果你用以下两种方式之一实现它会更好:

  1. 您处理html中的数据列表并将其发送到webview并完全删除recycler view
  2. 您在xml中绘制预期内容的布局并将其直接充气到recyclerview并删除webview完成。 (注意:您可以根据适配器位置和该位置的数据将不同的视图填充到回收器中)。

使用 webview 似乎是实现您正在尝试的任何东西的简单方法,但相信我,弊大于利。所以最好避免它。

【讨论】:

  • 如果您实现应用程序范围的缓存并使用应用程序上下文创建 WebView,则 RecyclerView 中的 WebView 是可管理的。这样您就不必在每次滚动到视口或每次屏幕方向更改时重新初始化它。
  • @EugenPechanec 你能详细说明一下吗?
  • 是的,你能告诉更多关于如何在应用程序范围内管理 webviews 的信息。
【解决方案2】:

这个问题有很多可能的原因

  • 当您滚动非常快时 Recyclerview 纯粹基于将视图最小化并重用现有视图。这意味着当您在视图(一个项目)退出屏幕时滚动时,只需更改其内容即可在下面购买相同的视图。当您从互联网加载时,最好先下载所有数据然后显示它。 Webview 消耗大量数据,这完全违背了将它们放在 Recyclerview 中的设计原则。

要修复此问题,您可能会添加一些按钮以在每次显示视图时重新加载数据或刷新。

  • Nougat 从 http urlconnection 类中删除了一些函数 我不确定这个。但是在一段谷歌开发者视频中,T 看到了一些关于某些功能和方法的折旧

希望你觉得这很有帮助。

【讨论】:

    【解决方案3】:

    我通过在 RecyclerView 的上层浮动一个 WebView 来解决这个问题,同时在 RecyclerView 中放置一个 HOLDER 视图。 然后我为 RecyclerView 的滚动事件注册了一个监听器。 I 控制浮动 WebView 的位置和可见性

    【讨论】:

      【解决方案4】:

      你可以在onCreateViewHolder试试这段代码

      ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                              WebView web = new WebView(parent.getContext());
                              web.setLayoutParams(lp);
                              String url="...";
                              WebSettings settings = web.getSettings();
                              settings.setJavaScriptEnabled(true);
                              settings.setDomStorageEnabled(true);
      
                              web.loadUrl(url);
                              holder = new ViewHolder(web);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-17
        • 2013-08-25
        • 1970-01-01
        • 2021-07-15
        • 2014-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多