RecyclerView内部的Webview有时仅在Nougat设备上显示空白屏幕

时间:2017-07-25 10:13:28

标签: android google-chrome webview

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

错误链接: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或更高版本。

4 个答案:

答案 0 :(得分:3)

对于启动webview消耗内存,因为它必须加载并呈现html数据。我认为如果你用以下两种方式实现它会更好,而不是在回收站视图中使用webview:

  1. 您处理html中的数据列表并将其发送到webview并完全删除回收站视图
  2. 您在xml中绘制预期内容的布局并将其直接膨胀到recyclerview并删除完成的webview。 (注意:您可以根据适配器位置和该位置的数据将不同视图扩展到回收器中。)
  3. 使用webview似乎是实现你正在尝试的任何东西的简单方法,但相信我,这些缺点超过了收益。所以最好避免它。

答案 1 :(得分:1)

出于许多可能的原因,这个问题可能会出现

  • 滚动速度非常快 Recyclerview完全基于将视图膨胀最少时间并重用现有视图。这意味着当您在视图(一个项目)退出屏幕时滚动时,只需更改其内容即可在下面购买相同的视图。当您从Internet加载时,首先下载所有数据然后再显示它总是更好。 Webview消耗大量数据,完全违反设计原则,将它们放在Recyclerview中。

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

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

希望您觉得这很有帮助。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以在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);