如何避免闪烁,同时更新GridView的?(How to avoid flickering whil

2019-07-04 04:05发布

我有一个GridView。 林从10个图像阵列显示图像。 1分钟后我加入5个更多的图像。 要更新gridview的我用下面的代码。

aImgAdapterL.notifyDataSetChanged();  

aImgAdapterL是我ImgaeAdapter。 越来越显示新的图像。
我的问题是更新gridview的一个闪烁或闪烁的图像更新用期间发生的时候。 是否有可能隐藏闪烁?

Answer 1:

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

事实上,这是因为我的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;
}


Answer 2:

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

根除牛瘟的android.GridView源代码在这里 ,它允许网格视图重用为同一数据的视图,而不是做一个完整的重绘。 这可能有助于在OP的情况下,因为默认情况下hasStableIds返回false



Answer 3:

发生闪烁,因为更新UI是heavy.Please检查的天气你的adapter.The想法做)CPU密集型功能,如图像中的getview(裁剪是保持getview()函数简单,做的过程中单独密集逻辑线程。



Answer 4:

解决的办法是不重新加载图片时它并没有改变。

在您的适配器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,这样它会重新下一次。



Answer 5:

使用nostra13的通用图像装载机上显示您的图片,设置一些动画,同时表现出它。

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


Answer 6:

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

通过这种方法可避免闪烁。



Answer 7:

ImageViewAware (而不是ImageView的),不考虑实际的大小:的这一翻译:

imageLoader.displayImage(imageUri, imageView);

做以下操作:

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


Answer 8:

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

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

这就是它`



Answer 9:

您应该启用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);

最后,您可以更新期间覆盖你的网格视图和透明度发挥。



文章来源: How to avoid flickering while updating gridview?