如何防止每次调用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()
时加载新图像,则您必须想出一些办法来确定图像是否相同和以前一样,也检查一下。
资料来源:我也在我的应用程序中这样做。我通过阅读你的问题注意到了这个问题,否则我会一直让我的图像每次都重新加载,所以谢谢。
我用 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()
时加载新图像,则您必须想出一些办法来确定图像是否相同和以前一样,也检查一下。
资料来源:我也在我的应用程序中这样做。我通过阅读你的问题注意到了这个问题,否则我会一直让我的图像每次都重新加载,所以谢谢。