ListView在添加新项目时闪烁

时间:2013-06-05 16:56:52

标签: android android-listview

我正在使用ArrayAdapter在ListView中设置具有无限滚动功能的数据。 ListView的行中有一个ImageView和两个TextView。首先,我正在加载带有10个项目的ListView,然后向下滚动,我调用setonscrolllistener中的Web服务将下一个10项加载到ListView。当新项目添加到Arraylist时,我只需调用adapter.notifysetdatachanged告诉适配器刷新ListView。

现在的问题是,每当新项目被添加到ListView时,整个ListView都会刷新,这会导致ListView中已加载的图像闪烁。是的,我正在缓存光盘和内存中的所有图像,代码可以非常顺利地进行缓存。

我还尝试使用此adapter.addall(myarraylist)将数据添加到适配器中,但它没有帮助。 ImageViews仍在闪烁。我在StackOverflow上搜索了很多关于它的内容,发现你无法在不刷新整个listView的情况下在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;
    }

有人可以对此有所了解吗?

2 个答案:

答案 0 :(得分:2)

您似乎正在以正确的方式执行此操作,因此问题可能来自您的imageLoader。如果网址相同,则不应在imageview上再次设置图像。

e.g。您可以在imageView上使用setTag (url)方法,并测试网址是否已更改。

希望这会对你有所帮助。

答案 1 :(得分: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,以便下次重新加载。