我有一个与此问题类似的问题: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 高度恰好是之前设置的(之前的值是由充气器自动设置的)。
您的两个解决方案是:
- 不要回收 View - 只是每次都生成一个新 View 。您将看到性能受到影响,这可能仅在包含约 50 个或更多元素的列表中才会明显。如果它是一个小列表,这可能是最简单的(代码方面)选项,尽管它的运行速度仍然会稍慢。
- 继续回收 View - 如果您选择此选项,您将必须根据图像高度。这是可行的,但需要更多的工作。我建议
- secret 选项 3 - 标准化图像高度 - 如果您a.)想要继续回收 View ,但b.)不这样做不想编写代码来手动设置行高,并且 c.) 调整图像大小不会终止您的应用程序,您可以使用 setMaxHeight(int) 方法来确保所有图像都是相同的高度(或使用类似 this 的方法将图像调整为预定大小)
注意:我非常确定(几乎确定),通常情况下,如果高度设置为“wrap_content”,它会换行到新的内容大小(因为它通常会在内容更新时更新大小)已更新)。我无法说出为什么这种情况没有发生在你身上 - 可能是“wrap_content”内的某些内容的大小设置为具体值,因此不会调整大小,因此“wrap_content”即使存在也不会改变是空的空间。
关于android - listview回收奇怪的空空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11091355/