Android 无限滚动的ListView:如何防止刷新可见行?
我已经实现了Android 无限滚动的ListView:如何防止刷新可见行?,android,listview,android-listview,custom-adapter,Android,Listview,Android Listview,Custom Adapter,我已经实现了OnScrollListener,以了解用户是否在列表的末尾,并成功地将新数据添加到列表中,如下所示: @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == SCROLL_STATE_IDLE) { if (list.getLastVisiblePosition() >= list.getCount()-1)
OnScrollListener
,以了解用户是否在列表的末尾,并成功地将新数据添加到列表中,如下所示:
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == SCROLL_STATE_IDLE) {
if (list.getLastVisiblePosition() >= list.getCount()-1) {
currentPage++;
loadMore(currentPage);
adapter.notifyDataSetChanged();
}
}
}
问题是notifyDataSetChanged
按预期刷新整个ListView。但是,因为在我的列表中,有一些图像是从internet异步加载的,所以此刷新会导致图像再次加载,这显然是不需要的。Facebook、Twitter等应用程序最终无缝地附加新数据,而无需进行任何刷新。他们是如何做到的,我又是如何做到这无缝无边的卷轴呢
我想我必须在适配器的getView
方法中做些什么来防止重新加载,但我还没弄明白。有没有一个已知的方法
谢谢 您需要实现一个映像缓存。应该向缓存请求图像,并从internet异步加载它们,或者从内存加载它们(如果以前使用过)。缓存应该在
getView
中使用
缓存的最简单方法是使用hashmap(如果在单独的线程上异步获取图像,则可能是ConcurrentHashMap),其中键是url,值是要显示的图像。然后可以首先检查hashmap是否具有该值,否则获取图像并插入hashmap。如果你环顾四周,有很多其他方法可以做到这一点,但这可能是最简单的
此解决方案更加健壮,因为您不需要担心什么会失效,也不需要担心在请求同一图像时进行多次调用。缓存将有助于重新下载图像是的,但我无法避免刷新之前存在的行,我可以吗?@ecem我不知道你为什么对正在刷新的其他行如此关注,notifyDataSetChanged方法是处理此问题的正确方法。这些行一直被重绘,担心它们是过早的优化,特别是如果您在getView方法中正确使用convertView参数的话。用户会注意到的真正延迟是获取图像的网络延迟。如果你真的想测试这一点,只需将所有图像指向一个静态位图,并告诉我在使用notifyDataSetChanged时是否注意到任何延迟。好的,我已经尝试了你关于静态图像的建议,你是绝对正确的,更改一点也不明显。那就是了!谢谢大家!@没问题,很高兴能帮上忙。