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时是否注意到任何延迟。好的,我已经尝试了你关于静态图像的建议,你是绝对正确的,更改一点也不明显。那就是了!谢谢大家!@没问题,很高兴能帮上忙。