Cra*_*aig 8 android android-webview android-listview android-linearlayout
我有一个显示的活动ListView.其中的每个项目ListView都LinearLayout包含一个项目WebView.列表中可能有数百个项目,每个项目的高度不同.
第一个问题是,当重新使用循环视图时getView(),新视图始终是原始视图的高度,即使我已设置了layout_heightfor LinearLayout和WebViewto 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)
我认为问题在于,使用您编写的代码,系统首先测量容器高度(行 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 的世界有一个很好的讨论
| 归档时间: |
|
| 查看次数: |
5265 次 |
| 最近记录: |