Android listview回收奇怪的空白空间

Android listview回收奇怪的空白空间,android,listview,listadapter,recycle,Android,Listview,Listadapter,Recycle,我有一个与这个问题类似的问题: 上述问题已得到解决。但同样的解决方案不适用于我 我有一个由文本视图组成的列表视图。每个文本视图可以包含不同数量的图像。我使用html.imagegetter获取图像,并在列表适配器的getview方法中使用循环 如果textview中有一个或多个图像,则其高度将适合其内容。当此文本视图被回收并且新内容未填充之前定义的高度时,将出现空白 问题是我无法在getview中恢复textview高度,因为我不知道下一个列表项的高度 这是我的getview: public V

我有一个与这个问题类似的问题:

上述问题已得到解决。但同样的解决方案不适用于我

我有一个由文本视图组成的列表视图。每个文本视图可以包含不同数量的图像。我使用html.imagegetter获取图像,并在列表适配器的getview方法中使用循环

如果textview中有一个或多个图像,则其高度将适合其内容。当此文本视图被回收并且新内容未填充之前定义的高度时,将出现空白

问题是我无法在getview中恢复textview高度,因为我不知道下一个列表项的高度

这是我的getview:

public View getView(int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;

    View rowView = convertView;
    if (rowView == null) {
        LayoutInflater inflater = context.getLayoutInflater();
        rowView = inflater.inflate(resource, parent, false);
        holder = new ViewHolder();
        holder.imgAvatar = (ImageView) rowView.findViewById(R.id.imgAvatar);
        holder.textDetails = (TextView) rowView.findViewById(R.id.textDetails);
        holder.textPostTime = (TextView) rowView.findViewById(R.id.textPostTime);
        holder.textPost = (TextView) rowView.findViewById(R.id.textPost);
        rowView.setTag(holder);
    } else {
        holder = (ViewHolder) rowView.getTag();
    }

    holder.textDetails.setText(details.toString());
    holder.textPostTime.setText(x.postTime);
    holder.textPost.setText(Html.fromHtml(x.postBody, new URLImageGetter(holder.textPost, context), null, context));
    return rowView;
}
这是行布局:

<TextView
    android:ellipsize="none"
    android:autoLink="web"
    android:textColor="#000000"
    android:id="@+id/textPost"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

问题:listview回收机制无法根据其新内容计算已用视图的新高度。
如果不进行回收,则速度太慢。

因此,基本上您的问题在于回收视图。当您的视图从XML中膨胀时,它们会查看图像并决定要多高。这可以很好地工作,因为充气机可以使高度为“包裹内容”,即最高的子组件的高度-这是动态的

但是,当您的getview回收旧视图时,它(出于某种原因)不会更新行的高度,您也不会更新行的高度(您以前从未这样做过,因为充气机会从“包装内容”自动处理它)。从您描述的内容可以看出,您只得到一行,其中包含之前设置的视图高度(此先前值由充气机自动设置)

您的两个解决方案是:

  • 不要循环使用视图-每次只需将新视图充气即可。您将看到一个性能冲击,它可能仅在包含~50个元素或更多元素的列表中才明显。如果它是一个小列表,这可能是最简单的(代码方面的)选项,尽管在那里它仍然会稍微慢一些
  • 继续循环使用视图-如果选择此选项,则必须根据图像高度自行设置行的高度(或文本视图,无论决定它的是什么)。这是可行的,但需要更多的工作。我建议
  • 秘密选项3-正常化图像高度-如果你想a.)想继续循环视图,但b.)不想编写代码手动设置行高度,c.)调整图像大小不会杀死你的应用程序,你可以使用setMaxHeight(int)方法以确保所有图像的高度相同(或使用类似于将图像大小调整为预定大小的方法)

  • 注意:我非常确定(几乎可以肯定),通常情况下,如果高度设置为“wrap_content”,它将换行为新的内容大小(因为它通常在内容更新时更新大小)。我说不出为什么你不会发生这种情况——可能是“包装内容”中的某些内容将其大小设置为具体值,因此没有调整大小,因此“包装内容”即使有空白也不会更改。

    尝试在图像和文本视图上使用requestLayout。它将帮助listview重新计算回收视图的高度。

    只是澄清一下:列表中的行包含(一个或多个)动态来源的图像。列表项将自动增长以适应最大(最高)的图像,但当您滚动列表并循环使用视图时,如果最大的图像比列表行短,视图将不会收缩?@matt5784 yes。事实上,你解释得更好:)行决定了如何通过编程或XML来适应图像吗?@matt5784我已经编辑了我的问题。我没有做任何特定的事情来确定行高。它是动态确定的。如果不循环使用,列表将毫无用处,因为它太慢了。我不能在同一高度制作所有图像。即使我这样做了,我也会有同样的问题,因为一行中的图像数量不是固定的。您可以发布listview行的完整xml吗?(具体地说,图像所在的部分…)没有用于图像的xml。图像以异步方式添加到textview。我在这里使用html imagegetter: