5

我正在使用 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;
    }

有人可以解释一下吗?

4

2 回答 2

2

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

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

希望这会帮助你。

于 2013-06-05T17:13:12.017 回答
1

The solution is to not reload your image when it did not change.

In your adapters getView() do:

// 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
}

on success (add a ImageLoadingListener) you set holder.lastImageUrl = path, on fail and cancel you set holder.lastImageUrl to null so that it will reload next time.

于 2014-09-17T12:46:10.827 回答