2

我有一个与这个问题类似的问题:ListView and rows回收问题

以上解决。但同样的解决方案对我不起作用。

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

如果 textview 中有一个或多个图像,它的高度将能够适应其内容。当这个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" />

问题:列表视图回收机制无法根据新内容计算已使用视图的新高度。不回收,太慢了。

4

2 回答 2

2

所以,基本上你的问题是回收视图。当您的视图从 XML 膨胀时,它们会查看图像并决定要多高。这很好用,因为充气机可以导致高度为“wrap_content”,也就是最高的子组件有多高——这是动态的。

但是,当您的 getview 回收旧视图时(出于某种原因),它不会更新行的高度,您也不会(您以前从未这样做过,因为充气器会从“wrap_content”自动处理它)。从您的描述中可以看出,无论视图的高度是什么,您都会得到一行(之前的值是由充气机自动设置的)。

您的两个解决方案是:

  1. 不要回收视图- 每次都增加一个新视图。您将看到性能下降,这可能仅在具有约 50 个或更多元素的列表中才会明显。如果它是一个小列表,这可能是最简单的(代码方面)选项,尽管它仍然会运行得稍微慢一些。
  2. 继续回收视图- 如果你选择这个,你将不得不根据图像高度自己设置行的高度(或文本视图,无论是什么决定的) 。这是可行的,但需要更多的工作。我建议
  3. 秘密选项 3 - 标准化图像高度- 如果您愿意a.)想继续回收视图但b.)不想编写代码来手动设置行高和c.)调整图像大小不会杀死你应用程序,您可以使用 setMaxHeight(int) 方法来确保所有图像的高度相同(或使用这样的方法图像调整为预定大小)

注意:我很确定(几乎可以肯定),通常情况下,如果将高度设置为“wrap_content”,它将换行到新的内容大小(因为它通常会在内容更新时更新大小)。我不能说为什么这不会发生在你身上——可能是“wrap_content”中的某些东西的大小设置为一个具体的值,因此没有调整大小,所以“wrap_content”没有改变,即使有是空的空间。

于 2012-06-18T22:22:59.523 回答
1

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

于 2014-09-29T08:59:18.353 回答