当向ListView中添加新项时,列表会闪烁

5
我正在使用ArrayAdapter来实现带有无限滚动功能的ListView数据设置。每个ListView行中都有一个ImageView和两个TextView。一开始,我用10个项目加载ListView,并在向下滚动时,在setonscrolllistener中调用web服务以将下一个10个项目加载到ListView中。当新项目添加到ArrayList中时,我只需调用adapter.notifysetdatachanged来告诉适配器刷新ListView。
现在的问题是,每当新项目添加到ListView中时,整个ListView都会刷新,这会导致ListView中已经加载的图像闪烁。是的,我将所有图像缓存在磁盘和内存中,代码对缓存的处理非常顺畅。
我还尝试使用adapter.addall(myarraylist)将数据添加到适配器中,但没有帮助。ImageView仍然会闪烁。我在StackOverflow上搜索了很多相关信息,发现不能在不刷新整个ListView的情况下添加和显示更多的项目。我已经知道了这一点,但必须有一种方法可以向ListView添加新数据而不刷新已加载的数据。
我是这样设置适配器的。
public View getView(int position, View view, ViewGroup parent) 
      {

        int main = R.layout.layout;
        ViewHolder holder = null;
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (view == null) {

            holder = new ViewHolder();
            view = inflater.inflate(main, null);
            holder.image = (ImageView) convertView.findViewById(R.id.imageview);

            ///More stuff

            view.setTag(holder);
        } else {
            holder = (ViewHolder)view.getTag();
        }

        // Loading ImageViews by Urls

        return view;
    }

请问有人能够解释一下吗?


不确定,但可能与此相关。https://dev59.com/LmrXa4cB1Zd3GeqPBrH6 - Zerkz
尝试使用此链接 https://github.com/commonsguy/cwac-endless。 - Pawan Yadav
你能展示一下你是如何将图片加载到视图中的吗?谢谢。 - albertosh
2个回答

2

看起来你的方法是正确的,所以问题可能出在你的 imageLoader 上。如果 url 相同,它不应该再次设置图像到你的 imageview 上。

例如:你可以使用 setTag(url) 方法在你的 imageView 上,并测试 url 是否已更改。

希望这能帮到你。


2
看起来这是通用图像加载器的问题。我会尝试使用另一个库,并告诉您问题是否仍然存在。感谢您的回复。 - Avi Singh
1
在我的情况下,这是图像加载器的问题。一旦我开始检查代码是否会下载相同的图像,闪烁效果就消失了。 - Bobrovsky

1
解决方法是当图像没有改变时不重新加载它。
在你的适配器的getView()方法中:
// schedule rendering:
final String path = ... (set path here);
if (holder.lastImageUrl == null || !holder.lastImageUrl.equals(path)
                || holder.headerImageView.getDrawable() == null) {
    // refresh image
    imageLoader.displayImage(imageUri, imageAware);
} else {
    // do nothing, image did not change and does not need to be updated
}

在成功时(添加一个ImageLoadingListener),您设置holder.lastImageUrl = path,如果失败或取消,则将holder.lastImageUrl设置为null,以便下次重新加载。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接