如何在更新gridview时避免闪烁?

我有一个gridview。 Im显示从10个图像的数组中的图像。 1分钟后,我又添加了5张图片。 更新gridview我使用下面的代码。

aImgAdapterL.notifyDataSetChanged(); 

aImgAdapterL是我的ImgaeAdapter。 新图像正在显示。
我的问题是当更新图像更新过程中更新gridview闪烁或闪烁发生。 是否有可能隐藏闪烁?

Solutions Collecting From Web of "如何在更新gridview时避免闪烁?"

我有同样的问题,并能够解决这个问题:

实际上,这是由于我的ListAdapter在整个列表刷新时没有正确pipe理的情况。 如果是这样,你想要做的是保持已经显示在屏幕上的项目。

为此,在获取再循环项目时,在适配器的getView方法中,您必须检查它是否不是您想要显示的那个。 如果是这样,直接返回。

 @Override public View getView(int position, View convertView, ViewGroup container) { ImageView imageView; String src = this.getItem(position).getSrcThumbnail(); if (convertView == null) { imageView = new ImageView(getContext()); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 120, getResources().getDisplayMetrics()); imageView.setLayoutParams(new GridView.LayoutParams(GridView.LayoutParams.MATCH_PARENT, height)); } else { imageView = (ImageView) convertView; // When you get a recycled item, check if it's not already the one you want to display. String newSrc = (String) imageView.getTag(); if(newSrc.equals(src)){ // If so, return it directly. return imageView; } } loadBitmap(this.getItem(position).getSrcThumbnail(), imageView); // Here you set the unique tag that allow to identify this item. imageView.setTag(src); return imageView; } 

如果您的适配器具有稳定的ID,请覆盖hasStableIds以返回true

grep android.GridView源代码在这里 ,它允许网格视图重复使用相同的数据视图,而不是完全重绘。 这可能有助于OP的情况,因为默认hasStableIds返回false

发生闪烁是因为更新UI太重了。请检查您是否在执行适配器的getview()中的图像裁剪等cpu密集function的天气。想法是保持getview()函数简单,并单独执行进程密集型逻辑线程。

解决方法是在没有更改的情况下不重新加载图像。

在你的适配器getView()做:

 // schedule rendering: final String path = ... (get 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为空,这样它会重新加载下一次。

使用nostra13的通用图像加载器显示您的图像,设置一些animation,同时显示它。

 ...DisplayImageOptions.displayer(FadeInBitmapDisplayer)... 

在这里我写了一个详细的例子如何使用视图模式:

采用这种方法可以避免闪烁。

通过不考虑实际视图大小的ImageViewAware (而不是ImageView):Intead:

 imageLoader.displayImage(imageUri, imageView); 

做以下事情:

 ImageAware imageAware = new ImageViewAware(imageView, false) imageLoader.displayImage(imageUri, imageAware); 

简单的解决scheme是1)有一个方法在你的适配器,将追加/重置您的新数据列表到旧的数组列表,而不是调用notifyDataSetChanged()当用户将滚动getview将被调用,因此列表将被更新。 它不应该闪烁。

例如// Have a method in adapter class public void updateList(ArrayList<ABC> list) { /input代码/添加到旧的oldList.addAll(list); }

这就是它

您应该启用OpenGL和硬件加速:

 <application android:hardwareAccelerated="true" ...> <uses-feature android:name="string" android:required=["true" | "false"] android:glEsVersion="integer" /> 

您也可以在gridview的项目上使用硬件caching:

 view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

最后,您可以在更新过程中覆盖网格视图,并使用透明度播放。