【问题标题】:Image flicker in recyclerview with glide带有滑动的recyclerview中的图像闪烁
【发布时间】:2019-05-26 13:25:48
【问题描述】:

我正在使用 glide 3.7 从 firebase 存储中加载 recyclerview 中的图像。当新图像添加到 recyclerview 并调用 notifydatasetchanged 时,recyclerview 中的所有现有图像都会闪烁并再次重新加载。调用 notifydatasetchanged 时如何避免图像闪烁。 这是我的适配器类

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {

    private static final String TAG = "RecyclerAdapter";


    private Context mContext;
    private List<ModelGridItems> gridItemsList;
    private boolean fromService;

    public RecyclerAdapter(Context context, List<ModelGridItems> list, boolean fromservice) {
        gridItemsList = list;
        mContext = context;
        fromService = fromservice;
    }


    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.grid_items, parent, false);
        return new RecyclerAdapter.MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        try {
            holder.bind(gridItemsList.get(position));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    @Override
    public int getItemCount() {
        if (gridItemsList == null) {
            return 0;
        }
        return gridItemsList.size();
    }





    class MyViewHolder extends RecyclerView.ViewHolder {
        ImageView btnAction;
        TextView tvParticipantName;
        ImageView ivParticipantImage;
        TextView tvConnection;

        MyViewHolder(View itemView) {
            super(itemView);
            ivParticipantImage = itemView.findViewById(R.id.profile_image);
            btnAction = itemView.findViewById(R.id.iv_more);

            tvParticipantName = itemView.findViewById(R.id.tv_username);
            tvParticipantName.setTypeface(BaseActivity.typefaceCabinBold);

            tvConnection = itemView.findViewById(R.id.tv_status);
            tvConnection.setTypeface(BaseActivity.typefaceCabinBold);

        }

        void bind(final ModelGridItems item) {
            tvParticipantName.setText(item.getParticipantName());
            if (item.getIsConnecting()) {
                tvConnection.setVisibility(View.VISIBLE);
            } else {
                tvConnection.setVisibility(View.GONE);
            }
            if (item.getParticipantId().equals(BaseActivity.mUniqueId)) {
                btnAction.setVisibility(View.INVISIBLE);
            }
            if (BaseActivity.mUniqueId.equals(item.getParticipantId())) {
                loadProfileImage();

            } else {
                StorageReference storageReference = BaseActivity.storageReference.child(AppConfig.profileBucket + item.getParticipantId() + AppConfig.ImageExtension);
                SharedMethods.loadFromCloudCircular(mContext, ivParticipantImage, storageReference);
            }
            btnAction.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    showAnchorMenu(btnAction, item.getParticipantId());
                }

            });
            ivParticipantImage.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (fromService) {
                        Intent groupCallIntent = new Intent(mContext, GroupCall.class);
                        groupCallIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        groupCallIntent.putParcelableArrayListExtra("GridItems", (ArrayList<? extends Parcelable>) gridItemsList);
                        mContext.startActivity(groupCallIntent);
                    } else {
                        SharedMethods.showLargeImageFromCloud(mContext, item.getParticipantId());
                    }

                }
            });


        }

        private void loadProfileImage() {
            if (SharedMethods.isPermissionGranted(SharedMethods.PERMISSION_WRITE_STORAGE, mContext)) {
                SharedMethods.loadFromLocalStorageCircular((Activity) mContext, ivParticipantImage, SharedMethods.profileImagePath());
            } else {
                StorageReference storageReference = BaseActivity.storageReference.child(AppConfig.profileBucket + BaseActivity.mUniqueId + AppConfig.ImageExtension);
                SharedMethods.loadFromCloudCircular(mContext, ivParticipantImage, storageReference);
            }
        }
    }

}

此方法从 firebase 存储中加载图像

public static void loadFromCloudCircular(final Context context, final ImageView imageView, StorageReference storageReference) {
        Glide.with(context)
                .using(new FirebaseImageLoader())
                .load(storageReference)
                .skipMemoryCache(true)
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .placeholder(R.drawable.unknown_image)
                .transform(new CircularTransform(context))
                .into(new SimpleTarget<GlideDrawable>() {
                    @Override
                    public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
                        imageView.setImageDrawable(resource);
                        Dashboard.isCircularLoaded = true;
                    }
                });


    }

我尝试了不同的选项,例如 setHasStableIds(true) 但这会将项目添加到现有项目的顶部,并将动画添加到其位置。也尝试使用下面显示的 itemanimator,但图像总是闪烁。有什么帮助吗?

ItemAnimator animator = rv.getItemAnimator();
if (animator instanceof SimpleItemAnimator) {
    ((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
}

【问题讨论】:

    标签: android android-recyclerview android-glide


    【解决方案1】:

    建议一:用毕加索代替 Glide Picasso Square Image Viewer

    我有点不喜欢 Glide,Picasso 在语法上和它很相似。

    建议 2:不要使用 1MB 以上的图片

    如果您在手机的 250dp 高度查看它,它会占用大量内存,并且不会影响图像质量。如果您从应用程序本身上传,最好减小图像的大小并将其发送到 firebase。 如果您在缩小图片尺寸方面需要帮助,请查看此链接。Codota link to compress images to required size

    重要建议:暂时不要使用动画,看看它是否还在闪烁

    试试这些建议,看看是否有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      相关资源
      最近更新 更多