Android ListView预加载数据行

Android ListView预加载数据行,android,listview,Android,Listview,我在我的应用程序中有一个Android ListView,我在每行显示不同的图像(每行1个图像,高度未定义)。这些图像是使用AsyncTask从web加载的,否则它会从缓存中提取图像,所以一切正常 过程是,我有一个指向图像的url,在适配器的每个getView中(除非在缓存中找到),我启动一个异步任务来设置带有图像的ImageView。我给它一个定义的宽度,以适应屏幕(然后我使用这个定义的宽度来缩放高度,所以在下载和设置之前我知道宽度,但不知道高度(或图像的纵横比) 向下滚动时,一切正常,因为列

我在我的应用程序中有一个Android ListView,我在每行显示不同的图像(每行1个图像,高度未定义)。这些图像是使用AsyncTask从web加载的,否则它会从缓存中提取图像,所以一切正常

过程是,我有一个指向图像的url,在适配器的每个getView中(除非在缓存中找到),我启动一个异步任务来设置带有图像的ImageView。我给它一个定义的宽度,以适应屏幕(然后我使用这个定义的宽度来缩放高度,所以在下载和设置之前我知道宽度,但不知道高度(或图像的纵横比)

向下滚动时,一切正常,因为列表视图预加载了5行。。它在我的代码中启动了5个下载图像的调用。这使得向下滚动更加平滑。 问题是当我向上滚动时。当我向上滚动时,视图被重用,我知道一个宽度,这样就可以了,但最初高度是0,直到我完全加载图像;当它被完全加载时,图像视图被扩展到任何高度(即1024),这使得滚动起伏,因为它将视图从0扩展到1024,并将焦点恢复到该视图的顶部


问题:是否可以将列表视图设置为预加载向下滚动和向上滚动到某个大小?所以当向上滚动时,我的ListView有5行可以显示。我知道android.support.v4.view.ViewPager可以实现这一点(默认情况下,它预加载+1和-1..,但可以更改为+5和-5)

据我所知,我认为您应该在适配器中覆盖
newView
,而不是
getView
,它扩展了
BaseAdapter
。别忘了调用
super.newView

原因是在向上滚动时避免绑定视图(行)。方法
newView
对每行调用一次且仅一次。而
getView
也会绑定视图,这会使图像在向上滚动时再次加载。如果我没记错的话,我想这就是问题所在


当然,这只有在图像加载后不改变的情况下才有意义。如果图像应该在上下滚动时动态改变,我猜你被卡住了,但我怀疑情况是否如此。我想,您不会保存旧/废弃图像的高度。

您使用什么作为适配器?在其中,您使用的是bindView吗?我使用的是BaseAdapter。。只需使用getView,膨胀我的一个布局,将视图设置为我想要的并返回它。我有一种解决方案。。下载新图像时,我会记录高度并将其放入HashMap中,因此稍后,检查其缓存图像是否正确,如果正确,我知道其高度,因此设置图像视图对象的宽度和高度,使其不会跳跃。。但在其生命周期中重新创建片段/活动可能会很麻烦。。。我不知道该如何传递。我只是在
RecyclerView
中遇到了这个问题。(a) 这可能会引起您的兴趣,(b)它提到了处理类似用例的
ViewHolder
模式。。所以,当您随机上下滚动时,每行只调用1个asynchtask?而且,您可以在asynchtask中以数据形式加载高度,一个来自服务器的数字。它必须要快得多。是的,它们没有。我以特定的顺序拉取URL数组并显示它们,有时刷新时,顺序可能会改变,但这就是为什么我将URL哈希到高度,而不是位置到高度。我已经研究了newView方法。。它没有位置?我正在使用它和ArrayList访问我的所有数据。。除了getView,我什么都没用过,所以我可能遗漏了一些东西。好吧,如果位置改变,我不知道该怎么办。也许可以快速加载高度/URL作为数据/数字?我想我会调整我的数据库以保持宽度和高度,并在请求中获取该信息,然后获取其余信息,并在尝试下载之前设置imageView。非常感谢。