如何防止每次调用notifyDataSetChanged()时GridView震动(加载图片)?

How to prevent GridView vibration (loading images) every time I call notifyDataSetChanged()?

我用 universal-image-loader 显示 gridview,每个网格项目包括 ImageView 和 LoadingLinearProgress ,随着时间的推移我需要更新 LoadingLinearProgress(underLineProgress) 设置百分比值以便接收百分比我调用 notifyDataSetChanged();并且gridView的图片每次通知时都会震动(每次都会调用loadImage)

public View getView(final int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.my_library_grid_item, parent, false);
        holder.ivCover = (LinearLayout) convertView.findViewById(R.id.iv_cover);
        holder.underLineProgress = (LoadingLinearProgress) convertView.findViewById(R.id.underline_progress);
      convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    loadAndDisplayImage(fileName,holder.ivCover);
    holder.underLineProgress.setPercent(getItem(position).getPercent);
    String firstPageUrl = magazineList.get(position).getFirtPage();
    loadAndDisplayImage(firstPageUrl, holder.ivCover, holder.libraryBackground);
    return convertView;
}




 private void loadAndDisplayImage(String fileName, ImageView imageView) {


    imageLoader.displayImage(fileName, imageView, getStoringUILOptions(), new ImageLoadingListener() {
        @Override
        public void onLoadingStarted(String imageUri, View view) {

        }

        @Override
        public void onLoadingFailed(String imageUri, View view, FailReason failReason) {

        }

        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
           }

        @Override
        public void onLoadingCancelled(String imageUri, View view) {

        }
    });

}

尝试这种方式:向 ViewHolder class 添加一个变量,它将包含您使用 magazineList.get(position) (或 getItem(position) 获得的对象中的一些信息,取决于您的网格的工作方式)。在加载图像之前,检查存储在 holder 中的变量是否与当前项目中的变量具有相同的值。如果不一样,说明视图正在被回收,否则说明notifyDataSetChanged()已经被调用过,这样就不会调用loadAndDisplayImage.
如果正在回收视图,则将 holder 的变量值设置为当前项目之一。

代码示例:

public View getView(final int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.my_library_grid_item, parent, false);
        holder.ivCover = (LinearLayout) convertView.findViewById(R.id.iv_cover);
        holder.underLineProgress = (LoadingLinearProgress) convertView.findViewById(R.id.underline_progress);
        holder.currentMagazine = "NONE"; // to avoid checking for null every time
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.underLineProgress.setPercent(getItem(position).getPercent);
    // I don't know what the above line is for, so I put it here. I guess it's
    // the one you have to run every time

    if(holder.currentMagazine.equals(getItem(position).title))  {// for example

        loadAndDisplayImage(fileName, holder.ivCover);
        String firstPageUrl = magazineList.get(position).getFirtPage();
        loadAndDisplayImage(firstPageUrl, holder.ivCover, holder.libraryBackground);

        holder.currentMagazine = getItem(position).title;
    }

    return convertView;
}

private static class ViewHolder {
    String currentMagazine;
    ImageView ivCover;
    LoadingLinearProgress underLineProgress;
}

如果项目的图像有可能发生变化,并且您必须在调用 notifyDataSetChanged() 时加载新图像,则您必须想出一些办法来确定图像是否相同和以前一样,也检查一下。

资料来源:我也在我的应用程序中这样做。我通过阅读你的问题注意到了这个问题,否则我会一直让我的图像每次都重新加载,所以谢谢。