android - listview回收奇怪的空空间

标签 android listview listadapter recycle

我有一个与此问题类似的问题:ListView and rows recycling problem

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

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

如果 TextView 中有一张或多张图像,它将有一个能够适合其内容的高度。当这个textview被回收并且新内容没有填充之前定义的高度时,就会出现空白区域。

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

这是我的获取 View :

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 回收机制无法根据新内容计算已用 View 的新高度。 没有回收的话,太慢了。

最佳答案

所以,本质上你的问题是回收 View 。当您的 View 因 XML 而膨胀时,它们会查看图像并决定高度。这工作正常,因为充气器可以导致高度为“wrap_content”,即最高子组件的高度 - 这是动态的。

但是,当您的 getview 回收旧 View 时,它(出于某种原因)不会更新行的高度,您也不会(您以前从未这样做过,因为充气器会从“wrap_content”自动处理它) )。从您的描述看来,您只是得到了一行,其中的 View 高度恰好是之前设置的(之前的值是由充气器自动设置的)。

您的两个解决方案是:

  1. 不要回收 View - 只是每次都生成一个新 View 。您将看到性能受到影响,这可能仅在包含约 50 个或更多元素的列表中才会明显。如果它是一个小列表,这可能是最简单的(代码方面)选项,尽管它的运行速度仍然会稍慢。
  2. 继续回收 View - 如果您选择此选项,您将必须根据图像高度。这是可行的,但需要更多的工作。我建议
  3. secret 选项 3 - 标准化图像高度 - 如果您a.)想要继续回收 View ,但b.)不这样做不想编写代码来手动设置行高,并且 c.) 调整图像大小不会终止您的应用程序,您可以使用 setMaxHeight(int) 方法来确保所有图像都是相同的高度(或使用类似 this 的方法将图像调整为预定大小)

注意:我非常确定(几乎确定),通常情况下,如果高度设置为“wrap_content”,它会换行到新的内容大小(因为它通常会在内容更新时更新大小)已更新)。我无法说出为什么这种情况没有发生在你身上 - 可能是“wrap_content”内的某些内容的大小设置为具体值,因此不会调整大小,因此“wrap_content”即使存在也不会改变是空的空间。

关于android - listview回收奇怪的空空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11091355/

相关文章:

android - 如何使用内置图标和模板?

java - 未获取 Firebase 数据库生成的唯一 ID

android - 如何删除 ListView 中的数据,其数据来自android中的数组列表

android - Android:在View上启用触摸声音

使用 "android.test.PerformanceTestCase"接口(interface)进行Android性能测试

wpf - ListView 文本换行而不指定宽度

listview - 当列表项很少时,如何将 ListView 项与屏幕底部对齐?

Android ListActivity onListItemClick 调用适配器 getView

android - 如何将 SimpleCursorAdapter 与 single_choice 和 multiple_choice 一起使用

android - 使用幻灯片删除项目 ListView - 像 Gmail