WebViews的ListView - 重用不同高度的项目失败; 在显示任何视图之前询问所有视图

Cra*_*aig 8 android android-webview android-listview android-linearlayout

我有一个显示的活动ListView.其中的每个项目ListViewLinearLayout包含一个项目WebView.列表中可能有数百个项目,每个项目的高度不同.

第一个问题是,当重新使用循环视图时getView(),新视图始终是原始视图的高度,即使我已设置了layout_heightfor LinearLayoutWebViewto wrap_content.

第二个问题是,getView()即使只有前五个或六个适合屏幕,似乎也会对列表中的每个项目进行调用.我在使用其他列表项类型时没有看到这个.例如,在另一个地方我是一个高度相同的自定义视图列表,我只看到getView()被调用最初适合屏幕的视图数量.

所以...我需要弄清楚如何强制回收WebViews来渲染他们的新内容,以便计算他们的高度而不是仅使用之前的高度.而且我想知道为什么系统在这种情况下要求我提供所有项目.

这是必备的代码片段:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <ListView 
        android:id="@+id/topPane"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:dividerHeight="1.0px"
        android:divider="#FFFFFF"
        android:smoothScrollbar="false"
        />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

行由以下内容构成:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >
    <WebView 
        android:id="@+id/rowWebView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="0.0px"
        android:scrollbars="none"
        />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

这是我的适配器中的getView().HTML片段现在来自一系列字符串.

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
        {
        String item = (String) getItem(position);
        if (convertView == null)
            {
            convertView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.rowview, parent, false);
            }
        WebView wv = (WebView) convertView.findViewById(R.id.rowWebView);
        wv.loadDataWithBaseURL(null, item, "text/html", "utf-8", "about:blank");
        return convertView;
        }
Run Code Online (Sandbox Code Playgroud)

Axe*_*cia 5

我认为问题在于,使用您编写的代码,系统首先测量容器高度(行 Linear_layout),然后测量内容(WebView)。但是第二个措施不会影响第一个措施,直到您调用 invalidate 或某种使容器重新计算其大小的方法。

关于为什么多次调用 getView 方法,请检查适配器的 getViewTypeCount() 方法。

 @Override
 public int getViewTypeCount()
 {
     return NumberOfTypeOfViewsInYourList;
 }
Run Code Online (Sandbox Code Playgroud)

文件指出:

“此方法返回将由 getView(int, View, ViewGroup) 创建的 View 类型的数量。每种类型代表一组可以在 getView(int, View, ViewGroup) 中转换的视图。如果适配器始终返回对于所有项目的相同类型的 View,此方法应返回 1。仅当在 AdapterView 上设置适配器时才会调用此方法。

我对这个方法有一个问题,给出一个大数字(比如 5000)使我的应用程序崩溃,看起来它在内部用于一些 ListView 计算。

希望它能有所帮助。

顺便说一句,关于ListViews 的世界有一个很好的讨论