带有无限滚动的ListView:如何防止刷新可见行?

时间:2013-09-16 13:20:59

标签: 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) {
            currentPage++;
            loadMore(currentPage);
            adapter.notifyDataSetChanged();
        }
    }
}

问题是notifyDataSetChanged按预期刷新整个ListView。但由于在我的列表中存在从互联网异步加载的图像,因此刷新会导致图像再次加载,这显然是不希望的。像Facebook,Twitter等应用程序在最后无缝地附加新数据,而根本没有这种刷新。他们是如何做到的,我怎样才能实现这种无缝的无限滚动?

我想我必须在我的适配器的getView方法中做一些事情以防止重新加载,但我还是想不通。有没有一种已知的方法呢?

谢谢!

1 个答案:

答案 0 :(得分:0)

您将要实现图像缓存。应该要求缓存图像,并从Internet异步加载它们,或者如果以前使用过,则从内存加载它们。缓存应该在getView

中使用

执行缓存的最简单方法是使用hashmap(如果您在单独的线程上获取图像异步,则可能是ConcurrentHashMap),其中键是url,值是要显示的图像。然后,您可以检查hashmap是否具有该值,否则也将获取该图像并插入到hashmap中。如果你环顾四周,还有很多其他方法可以做到这一点,但这可能是最简单的。

此解决方案更加强大,因为您无需担心无效的内容,并且在请求同一图像时无需担心多次调用。