我有一个GridView。 林从10个图像阵列显示图像。 1分钟后我加入5个更多的图像。 要更新gridview的我用下面的代码。
aImgAdapterL.notifyDataSetChanged();
aImgAdapterL是我ImgaeAdapter。 越来越显示新的图像。
我的问题是更新gridview的一个闪烁或闪烁的图像更新用期间发生的时候。 是否有可能隐藏闪烁?
我有一个GridView。 林从10个图像阵列显示图像。 1分钟后我加入5个更多的图像。 要更新gridview的我用下面的代码。
aImgAdapterL.notifyDataSetChanged();
aImgAdapterL是我ImgaeAdapter。 越来越显示新的图像。
我的问题是更新gridview的一个闪烁或闪烁的图像更新用期间发生的时候。 是否有可能隐藏闪烁?
我有同样的问题,并能解决这个问题是这样的:
事实上,这是因为我的ListAdapter
它没有正确管理的情况下,整个列表被刷新时。 如果是这样,你想要做的是保持已经显示在屏幕上,是项目。
要做到这一点,在方法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;
}
如果您的适配器具有稳定的IDS,覆盖hasStableIds
返回true
。
根除牛瘟的android.GridView
源代码在这里 ,它允许网格视图重用为同一数据的视图,而不是做一个完整的重绘。 这可能有助于在OP的情况下,因为默认情况下hasStableIds
返回false
。
发生闪烁,因为更新UI是heavy.Please检查的天气你的adapter.The想法做)CPU密集型功能,如图像中的getview(裁剪是保持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 =路径,对失败和取消设置holder.lastImageUrl为null,这样它会重新下一次。
使用nostra13的通用图像装载机上显示您的图片,设置一些动画,同时表现出它。
...DisplayImageOptions.displayer(FadeInBitmapDisplayer)...
通过这种方法可避免闪烁。
通ImageViewAware
(而不是ImageView的),不考虑实际的大小:的这一翻译:
imageLoader.displayImage(imageUri, imageView);
做以下操作:
ImageAware imageAware = new ImageViewAware(imageView, false)
imageLoader.displayImage(imageUri, imageAware);
简单的解决办法是1)有你的适配器,将追加/新的数据列表重新进入老年数组列表,而不是调用一个方法notifyDataSetChanged()
当用户将滚动getview将被调用,因此名单将被更新。 它不应该闪烁。
例如// Have a method in adapter class public void updateList(ArrayList<ABC> list) { /
输入代码here` /添加到旧的oldList.addAll(列表); }
这就是它`
您应该启用OpenGL和硬件加速:
<application android:hardwareAccelerated="true" ...>
<uses-feature
android:name="string"
android:required=["true" | "false"]
android:glEsVersion="integer" />
您也可以使用在你的GridView的项目硬件缓存:
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
最后,您可以更新期间覆盖你的网格视图和透明度发挥。