当添加新项目时,ListView闪烁



我使用ArrayAdapter在ListView中设置无尽滚动功能的数据。在ListView的行中有一个ImageView和两个textview。首先,我用10个项目加载ListView,然后向下滚动,我调用setonscrolllistener中的web服务来加载下一个10个项目到ListView。当新的项目被添加到数组列表时,我只需调用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;
    }

有谁能解释一下吗?

似乎你正在做正确的方式,所以问题可能来自你的imageLoader。如果url是相同的,它不应该在你的imageview上再次设置图像。

。你可以使用setTag (url)方法在你的imageView和测试,如果url已经改变。

解决方案是当图像没有改变时不重新加载。

在你的适配器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。lasttimageurl = path,如果失败并取消设置holder。

最新更新