ListView和可变高度项会导致滚动问题

时间:2013-12-16 03:27:05

标签: android listview scroll height adapter

我有一个ListView用于滚动字段列表,文本和照片。 两个高度都是动态的:textview可以包含一个非常长的段落或只是一个句子,并且图像被缩放以适合宽度,因此高度是可变的(您可以看到照片)。有些项目甚至没有图像。 enter image description here 这使得物品的高度非常不均匀。有一个项目可以是2个屏幕长,而另一个只有一行文本。

我有它工作等..但当我向上滚动时,由于在顶部插入了回收视图,滚动位置大约跳过新孩子的大小。向下滚动工作完美......

我或多或少地理解为什么,显然回收的视图在大小上完全不同,这使得一些滚动的算法失败,无论它在哪里。

我已阅读有关覆盖itemType()itemTypeCount的内容,但我不知道它是否与我的问题有关。在我做的测试中,它没有(神奇地)工作。

这可以轻松修复,任何技巧或魔法请求都可以在这里和那里进行修复吗?

有人建议编写View回收站来解决此问题:问题listview scrolls quite junky when therre are different row heights

View recycler会不会听起来那么复杂?

对不起抽象问题..

3 个答案:

答案 0 :(得分:4)

只需记住ImageView和TextView的高度,然后在回收视图时,从ListAdapter中的getView方法设置这些视图的高度(您需要为此扩展BaseAdapter)。

因此,您有一个包含数据的对象列表(某些文本,可能是图像URL等)。添加一个名为imageHeight的整数字段。第一次加载列表项的图像时,将ImageView的高度保存到与该列表项关联的数据对象中的整数字段。然后,在ListAdapter中的getView中,将ImageView的高度设置为imageHeight的值。

这将使您的适配器返回具有适当高度的视图。当然,这只有在您已经知道要加载的图像/文本的高度时才有效。如果您向上滚动,则会出现这种情况,因为这些项目已经加载。

答案 1 :(得分:1)

尝试在getView中缓存图像(在WeakHashMap中),然后向上滚动不需要重新加载图像,这会导致丑陋的高度重新计算......

答案 2 :(得分:-5)

不要使用getView(int position,View convertView,ViewGroup parent)方法的convertView。

每次调用getView时都必须给行充气。它会使滚动有点慢但你的问题将得到解决。