RecyclerView 在加载图像时出现抖动。为什么?

RecyclerView is jerking when loading with image. why?

目前,在使用 recyclerview 时,当我使用 Picasso 加载图像时,recyclerview 会出现抖动,当我在执行代码时评论图像加载代码时,recyclerview 工作正常。 我已经在下面发布了回收器适配器的完整代码。 请帮我解决problem.Thank你!

    public class fa extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    public static View viewShare;
    private static final OvershootInterpolator OVERSHOOT_INTERPOLATOR = new OvershootInterpolator(4);
    private ArrayList<String> page_title = new ArrayList<>();
    private ArrayList<String> page_thumb = new ArrayList<>();
    private ArrayList<String> type = new ArrayList<>();
    private ArrayList<String> page_id = new ArrayList<>();
    private ArrayList<String> feed_message = new ArrayList<>();
    public ArrayList<String> feed_id = new ArrayList<>();
    private ArrayList<String> feed_description = new ArrayList<>();
    private ArrayList<String> feed_image = new ArrayList<>();
    private ArrayList<String> feed_time = new ArrayList<>();
    private ArrayList<String> feed_link = new ArrayList<>();
    private ArrayList<String> feed_like = new ArrayList<>();

    public static final int VIEW_TYPE_DEFAULT = 1;
    public static final int VIEW_TYPE_LOADER = 2;

    private List<FeedItem> feedItems = new ArrayList<>();

    private Context context;
    private OnFeedItemClickListener onFeedItemClickListener;

    private boolean showLoadingView = false;

    public fa(Context context, ArrayList<String> page_id, ArrayList<String> page_title, ArrayList<String> page_thumb, ArrayList<String> feed_id, ArrayList<String> feed_message, ArrayList<String> feed_description, ArrayList<String> feed_image, ArrayList<String> feed_link, ArrayList<String> feed_time, ArrayList<String> type, ArrayList<String> feed_like) {
        this.context = context;
        this.page_id = page_id;
        this.page_title = page_title;
        this.page_thumb = page_thumb;
        this.feed_id = feed_id;
        this.feed_message = feed_message;
        this.feed_description = feed_description;
        this.feed_image = feed_image;
        this.feed_link = feed_link;
        this.feed_time = feed_time;
        this.type = type;
        this.feed_like = feed_like;
    }

    private void animateHeartButton(final fa.CellFeedViewHolder holder) {
        AnimatorSet animatorSet = new AnimatorSet();

        ObjectAnimator rotationAnim = ObjectAnimator.ofFloat(holder.btnLike, "rotation", 0f, 360f);
        rotationAnim.setDuration(300);
        rotationAnim.setInterpolator(ACCELERATE_INTERPOLATOR);

        ObjectAnimator bounceAnimX = ObjectAnimator.ofFloat(holder.btnLike, "scaleX", 0.2f, 1f);
        bounceAnimX.setDuration(300);
        bounceAnimX.setInterpolator(OVERSHOOT_INTERPOLATOR);

        ObjectAnimator bounceAnimY = ObjectAnimator.ofFloat(holder.btnLike, "scaleY", 0.2f, 1f);
        bounceAnimY.setDuration(300);
        bounceAnimY.setInterpolator(OVERSHOOT_INTERPOLATOR);
        bounceAnimY.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) {
                holder.btnLike.setImageResource(R.drawable.ic_heart_red);
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                heartAnimationsMap.remove(holder);
                dispatchChangeFinishedIfAllAnimationsEnded(holder);
            }
        });

        animatorSet.play(bounceAnimX).with(bounceAnimY).after(rotationAnim);
        animatorSet.start();

        heartAnimationsMap.put(holder, animatorSet);
    }


    private void animateHeart(final fa.CellFeedViewHolder holder) {
        AnimatorSet animatorSet = new AnimatorSet();

        ObjectAnimator rotationAnim = ObjectAnimator.ofFloat(holder.btnLike, "rotation", 0f, 360f);
        rotationAnim.setDuration(300);
        rotationAnim.setInterpolator(ACCELERATE_INTERPOLATOR);

        ObjectAnimator bounceAnimX = ObjectAnimator.ofFloat(holder.btnLike, "scaleX", 0.2f, 1f);
        bounceAnimX.setDuration(300);
        bounceAnimX.setInterpolator(OVERSHOOT_INTERPOLATOR);

        ObjectAnimator bounceAnimY = ObjectAnimator.ofFloat(holder.btnLike, "scaleY", 0.2f, 1f);
        bounceAnimY.setDuration(300);
        bounceAnimY.setInterpolator(OVERSHOOT_INTERPOLATOR);
        bounceAnimY.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) {
                holder.btnLike.setImageResource(R.drawable.ic_heart_outline_grey);
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                heartAnimationsMap.remove(holder);
                dispatchChangeFinishedIfAllAnimationsEnded(holder);
            }
        });

        animatorSet.play(bounceAnimX).with(bounceAnimY).after(rotationAnim);
        animatorSet.start();

        heartAnimationsMap.put(holder, animatorSet);
    }



    private void dispatchChangeFinishedIfAllAnimationsEnded(fa.CellFeedViewHolder holder) {
        if (likeAnimationsMap.containsKey(holder) || heartAnimationsMap.containsKey(holder)) {
            return;
        }

//        dispatchAnimationFinished(holder);
    }

    @Override
    public void onViewRecycled(RecyclerView.ViewHolder holder) {
        super.onViewRecycled(holder);
        Log.d("HelloWorld", "OnviewRecycled");
        ((CellFeedViewHolder) holder).clear();

    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == VIEW_TYPE_DEFAULT) {
            if(context == null){
                Log.d("CheckContext", ""+context);
            }
            View view = LayoutInflater.from(((MainActivity) context)).inflate(R.layout.item_feed, parent, false);
            CellFeedViewHolder cellFeedViewHolder = new CellFeedViewHolder(view);
            setupClickableViews(view, cellFeedViewHolder);
            return cellFeedViewHolder;
        } else if (viewType == VIEW_TYPE_LOADER) {
            LoadingFeedItemView view = new LoadingFeedItemView(context);
            view.setLayoutParams(new LinearLayoutCompat.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT)
            );
            return new LoadingCellFeedViewHolder(view);
        }
        return null;
    }
    private void resetLikeAnimationState(fa.CellFeedViewHolder holder) {
        holder.vBgLike.setVisibility(View.INVISIBLE);
        holder.ivLike.setVisibility(View.INVISIBLE);
    }


    private void updateLikesCounter(fa.CellFeedViewHolder holder, int toValue) {

        String likesCountTextFrom = holder.tsLikesCounter.getResources().getQuantityString(
                R.plurals.likes_count, toValue - 1, toValue - 1
        );
        holder.tsLikesCounter.setCurrentText(likesCountTextFrom);

        String likesCountTextTo = holder.tsLikesCounter.getResources().getQuantityString(
                R.plurals.likes_count, toValue, toValue
        );
        holder.tsLikesCounter.setText(likesCountTextTo);
    }
    private void setupClickableViews(final View view, final CellFeedViewHolder cellFeedViewHolder) {
        cellFeedViewHolder.btnShare.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewShare = cellFeedViewHolder.cardView;
                onFeedItemClickListener.onSharesClick(cellFeedViewHolder.cardView, cellFeedViewHolder.getAdapterPosition());
            }
        });
//        cellFeedViewHolder.btnMore.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                onFeedItemClickListener.onMoreClick(v, cellFeedViewHolder.getAdapterPosition());
//            }
//        });

        final GestureDetector gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener(){
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                viewShare = cellFeedViewHolder.cardView;
                cellFeedViewHolder.vBgLike.setVisibility(View.VISIBLE);
                cellFeedViewHolder.vBgLike.setScaleY(0.1f);
                cellFeedViewHolder.vBgLike.setScaleX(0.1f);
                cellFeedViewHolder.vBgLike.setAlpha(1f);

                AnimatorSet animatorSet = new AnimatorSet();

                ObjectAnimator bgScaleYAnim = ObjectAnimator.ofFloat(cellFeedViewHolder.vBgLike, "scaleY", 0.1f, 1f);
                bgScaleYAnim.setDuration(200);
                bgScaleYAnim.setInterpolator(fia.DECCELERATE_INTERPOLATOR);
                ObjectAnimator bgScaleXAnim = ObjectAnimator.ofFloat(cellFeedViewHolder.vBgLike, "scaleX", 0.1f, 1f);
                bgScaleXAnim.setDuration(200);
                bgScaleXAnim.setInterpolator(fia.DECCELERATE_INTERPOLATOR);
                ObjectAnimator bgAlphaAnim = ObjectAnimator.ofFloat(cellFeedViewHolder.vBgLike, "alpha", 1f, 0f);
                bgAlphaAnim.setDuration(200);
                bgAlphaAnim.setStartDelay(150);
                bgAlphaAnim.setInterpolator(fia.DECCELERATE_INTERPOLATOR);

                animatorSet.playTogether(bgScaleYAnim, bgScaleXAnim, bgAlphaAnim);

                animatorSet.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        int adapterPosition = cellFeedViewHolder.getAdapterPosition();
                        onFeedItemClickListener.onFeedTitleClick(view,
                                feedItems.get(adapterPosition).page_thum,
                                feedItems.get(adapterPosition).page_title,
                                feedItems.get(adapterPosition).feed_message,
                                feedItems.get(adapterPosition).feed_image,
                                feedItems.get(adapterPosition).feed_time,
                                feedItems.get(adapterPosition).feed_description,
                                feedItems.get(adapterPosition).type,
                                feedItems.get(adapterPosition).feed_link,
                                cellFeedViewHolder.cardView, true);
                    }
                });
                animatorSet.start();

                return true;
            }

            @Override
            public boolean onDoubleTap(MotionEvent e) {
                int adapterPosition = cellFeedViewHolder.getAdapterPosition();

                if(feedItems.get(adapterPosition).isLiked == false) {
                    cellFeedViewHolder.vBgLike.setVisibility(View.VISIBLE);
                    cellFeedViewHolder.ivLike.setVisibility(View.VISIBLE);
                    cellFeedViewHolder.vBgLike.setScaleY(0.1f);
                    cellFeedViewHolder.vBgLike.setScaleX(0.1f);
                    cellFeedViewHolder.vBgLike.setAlpha(1f);
                    cellFeedViewHolder.ivLike.setScaleY(0.1f);
                    cellFeedViewHolder.ivLike.setScaleX(0.1f);

                    AnimatorSet animatorSet = new AnimatorSet();

                    ObjectAnimator bgScaleYAnim = ObjectAnimator.ofFloat(cellFeedViewHolder.vBgLike, "scaleY", 0.1f, 1f);
                    bgScaleYAnim.setDuration(200);
                    bgScaleYAnim.setInterpolator(fia.DECCELERATE_INTERPOLATOR);
                    ObjectAnimator bgScaleXAnim = ObjectAnimator.ofFloat(cellFeedViewHolder.vBgLike, "scaleX", 0.1f, 1f);
                    bgScaleXAnim.setDuration(200);
                    bgScaleXAnim.setInterpolator(fia.DECCELERATE_INTERPOLATOR);
                    ObjectAnimator bgAlphaAnim = ObjectAnimator.ofFloat(cellFeedViewHolder.vBgLike, "alpha", 1f, 0f);
                    bgAlphaAnim.setDuration(200);
                    bgAlphaAnim.setStartDelay(150);
                    bgAlphaAnim.setInterpolator(fia.DECCELERATE_INTERPOLATOR);

                    ObjectAnimator imgScaleUpYAnim = ObjectAnimator.ofFloat(cellFeedViewHolder.ivLike, "scaleY", 0.1f, 1f);
                    imgScaleUpYAnim.setDuration(300);
                    imgScaleUpYAnim.setInterpolator(fia.DECCELERATE_INTERPOLATOR);
                    ObjectAnimator imgScaleUpXAnim = ObjectAnimator.ofFloat(cellFeedViewHolder.ivLike, "scaleX", 0.1f, 1f);
                    imgScaleUpXAnim.setDuration(300);
                    imgScaleUpXAnim.setInterpolator(fia.DECCELERATE_INTERPOLATOR);

                    ObjectAnimator imgScaleDownYAnim = ObjectAnimator.ofFloat(cellFeedViewHolder.ivLike, "scaleY", 1f, 0f);
                    imgScaleDownYAnim.setDuration(300);
                    imgScaleDownYAnim.setInterpolator(ACCELERATE_INTERPOLATOR);
                    ObjectAnimator imgScaleDownXAnim = ObjectAnimator.ofFloat(cellFeedViewHolder.ivLike, "scaleX", 1f, 0f);
                    imgScaleDownXAnim.setDuration(300);
                    imgScaleDownXAnim.setInterpolator(ACCELERATE_INTERPOLATOR);

                    animatorSet.playTogether(bgScaleYAnim, bgScaleXAnim, bgAlphaAnim, imgScaleUpYAnim, imgScaleUpXAnim);
                    animatorSet.play(imgScaleDownYAnim).with(imgScaleDownXAnim).after(imgScaleUpYAnim);

                    animatorSet.addListener(new AnimatorListenerAdapter() {
                        @Override
                        public void onAnimationEnd(Animator animation) {
                            likeAnimationsMap.remove(cellFeedViewHolder);
                            resetLikeAnimationState(cellFeedViewHolder);
                            dispatchChangeFinishedIfAllAnimationsEnded(cellFeedViewHolder);
                        }
                    });
                    animatorSet.start();

                    likeAnimationsMap.put(cellFeedViewHolder, animatorSet);
                    animateHeartButton(cellFeedViewHolder);
//                    cellFeedViewHolder.tsLikesCounter.setCurrentText(cellFeedViewHolder.vImageRoot.getResources().getQuantityString(
//                            R.plurals.likes_count, feedItems.get(adapterPosition).likesCount+1, feedItems.get(adapterPosition).likesCount+1
//                    ));
                    feedItems.get(adapterPosition).likesCount = feedItems.get(adapterPosition).likesCount+1;
                    updateLikesCounter(cellFeedViewHolder, feedItems.get(adapterPosition).likesCount);
                    if (context instanceof MainActivity) {
                        ((MainActivity) context).showLikedSnackbar(feedItems.get(adapterPosition).feed_id);
                    }
                    feedItems.get(adapterPosition).isLiked = true;
                }else if(feedItems.get(adapterPosition).isLiked == true){
                    if (context instanceof MainActivity) {
                        ((MainActivity) context).showLikedStatus(feedItems.get(adapterPosition).isLiked, null);
                    }
                }
                return true;
            }
        });

        cellFeedViewHolder.ivFeedCenter.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return gestureDetector.onTouchEvent(event);
            }
        });




        cellFeedViewHolder.ivFeedCenter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });


        cellFeedViewHolder.feedTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int adapterPosition = cellFeedViewHolder.getAdapterPosition();
                viewShare = cellFeedViewHolder.cardView;
                onFeedItemClickListener.onFeedTitleClick(view, feedItems.get(adapterPosition).page_thum,
                        feedItems.get(adapterPosition).page_title,
                        feedItems.get(adapterPosition).feed_message,
                        feedItems.get(adapterPosition).feed_image,
                        feedItems.get(adapterPosition).feed_time,
                        feedItems.get(adapterPosition).feed_description,
                        feedItems.get(adapterPosition).type,
                        feedItems.get(adapterPosition).feed_link,
                        cellFeedViewHolder.cardView, true);
            }
        });

        cellFeedViewHolder.btnLike.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int adapterPosition = cellFeedViewHolder.getAdapterPosition();
                if (feedItems.get(adapterPosition).isLiked == false) {
                    animateHeartButton(cellFeedViewHolder);
//                    cellFeedViewHolder.tsLikesCounter.setCurrentText(cellFeedViewHolder.vImageRoot.getResources().getQuantityString(
//                            R.plurals.likes_count, feedItems.get(adapterPosition).likesCount+1, feedItems.get(adapterPosition).likesCount+1
//                    ));
                    feedItems.get(adapterPosition).likesCount = feedItems.get(adapterPosition).likesCount+1;
                    updateLikesCounter(cellFeedViewHolder, feedItems.get(adapterPosition).likesCount);
                    if (context instanceof MainActivity) {
                        ((MainActivity) context).showLikedSnackbar(feedItems.get(adapterPosition).feed_id);
                    }
                    feedItems.get(adapterPosition).isLiked = true;
                }else if(feedItems.get(adapterPosition).isLiked == true){
                    feedItems.get(adapterPosition).isLiked = false;
//                    cellFeedViewHolder.tsLikesCounter.setCurrentText(cellFeedViewHolder.vImageRoot.getResources().getQuantityString(
//                            R.plurals.likes_count, feedItems.get(adapterPosition).likesCount, feedItems.get(adapterPosition).likesCount
//                    ));
                    animateHeart(cellFeedViewHolder);
                    feedItems.get(adapterPosition).likesCount = feedItems.get(adapterPosition).likesCount-1;
                    updateLikesCounter(cellFeedViewHolder, feedItems.get(adapterPosition).likesCount);
                    if (context instanceof MainActivity) {
                        ((MainActivity) context).showLikedStatus(feedItems.get(adapterPosition).isLiked, feedItems.get(adapterPosition).feed_id);
                    }
                }
            }
        });
//        cellFeedViewHolder.ivUserProfile.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                onFeedItemClickListener.onProfileClick(view);
//            }
//        });
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        ((CellFeedViewHolder) viewHolder).bindView(feedItems.get(position));

        if (getItemViewType(position) == VIEW_TYPE_LOADER) {
            bindLoadingFeedItem((LoadingCellFeedViewHolder) viewHolder);
        }
    }

    private void bindLoadingFeedItem(final LoadingCellFeedViewHolder holder) {
        holder.loadingFeedItemView.setOnLoadingFinishedListener(new LoadingFeedItemView.OnLoadingFinishedListener() {
            @Override
            public void onLoadingFinished() {
                showLoadingView = false;
                notifyItemChanged(0);
            }
        });
        holder.loadingFeedItemView.startLoading();
    }

    @Override
    public int getItemViewType(int position) {
        if (showLoadingView && position == 0) {
            return VIEW_TYPE_LOADER;
        } else {
            return VIEW_TYPE_DEFAULT;
        }
    }

    @Override
    public int getItemCount() {
        return feedItems.size();
    }

    public void updateItems(boolean animated) {
        feedItems.clear();
for(int i = 0; i < page_id.size(); i++){
    feedItems.addAll(Arrays.asList(new FeedItem(Integer.parseInt(feed_like.get(i)), page_id.get(i), page_title.get(i), page_thumb.get(i), feed_id.get(i), feed_message.get(i), feed_description.get(i), feed_image.get(i), feed_link.get(i), feed_time.get(i), type.get(i))));
}
        if (animated) {
            notifyItemRangeInserted(0, feedItems.size());
        } else {
            notifyDataSetChanged();
        }
    }

    public void setOnFeedItemClickListener(OnFeedItemClickListener onFeedItemClickListener) {
        this.onFeedItemClickListener = onFeedItemClickListener;
    }

    public void showLoadingView() {
        showLoadingView = true;
        notifyItemChanged(0);
    }

    public static class CellFeedViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.ivFeedCenter)
        ImageView ivFeedCenter;
        @BindView(R.id.btnShare)
        ImageButton btnShare;
        @BindView(R.id.btnLike)
        ImageButton btnLike;
//        @BindView(R.id.btnMore)
//        ImageButton btnMore;
        @BindView(R.id.vBgLike)
        View vBgLike;
        @BindView(R.id.ivLike)
        ImageView ivLike;
        @BindView(R.id.tsLikesCounter)
        TextSwitcher tsLikesCounter;
        @BindView(R.id.sourceImage)
        ImageView sourceImage;
        @BindView(R.id.sourceTitle)
        TextView sourceTitle;
        @BindView(R.id.postTime)
        TextView postTime;
        @BindView(R.id.feedTitle)
        TextView feedTitle;
        @BindView(R.id.vImageRoot)
        FrameLayout vImageRoot;
        FeedItem feedItem;
        @BindView(R.id.card_view)
        CardView cardView;

        public CellFeedViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);

        }

        public void bindView(FeedItem feedItem) {
            this.feedItem = feedItem;

            try {


    Picasso.with(sourceImage.getContext()).load(feedItem.page_thum).resize(300, 300).transform(new CircularTransform()).networkPolicy(NetworkPolicy.NO_CACHE).memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE).placeholder(R.drawable.placeholder).into(sourceImage);
                }catch (IllegalArgumentException e){
                   Picasso.with(sourceImage.getContext()).load(R.drawable.placeholder).transform(new CircularTransform()).networkPolicy(NetworkPolicy.NO_CACHE).memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE).into(sourceImage);
                }
                try{
                 Picasso.with(ivFeedCenter.getContext()).load(feedItem.feed_image).networkPolicy(NetworkPolicy.NO_CACHE).memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE).placeholder(R.drawable.placeholder).into(ivFeedCenter);
             Picasso.with(ivFeedCenter.getContext()).setLoggingEnabled(true);
                }catch (IllegalArgumentException e){
 Picasso.with(ivFeedCenter.getContext()).load(R.drawable.placeholder).networkPolicy(NetworkPolicy.NO_CACHE).memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE).into(ivFeedCenter);
                }
                sourceTitle.setText(feedItem.page_title);
                postTime.setText(feedItem.feed_time);
                if(feedItem.type.equals("facebook")){
                    feedTitle.setMaxLines(3);
                    feedTitle.setText(feedItem.feed_message);
                }else {
                    feedTitle.setText(feedItem.feed_message);
                }
                    btnLike.setImageResource(feedItem.isLiked ? R.drawable.ic_heart_red : R.drawable.ic_heart_outline_grey);
              tsLikesCounter.setCurrentText(vImageRoot.getResources().getQuantityString(
                        R.plurals.likes_count, feedItem.likesCount, feedItem.likesCount
                ));


        }

        public FeedItem getFeedItem() {
            return feedItem;
        }

    public static class LoadingCellFeedViewHolder extends CellFeedViewHolder {

        LoadingFeedItemView loadingFeedItemView;

        public LoadingCellFeedViewHolder(LoadingFeedItemView view) {
            super(view);
            this.loadingFeedItemView = view;
        }

        @Override
        public void bindView(FeedItem feedItem) {
            super.bindView(feedItem);
        }
    }

    public static class FeedItem {
        public int likesCount;
        public String page_id;
        public String page_title;
        public String page_thum;
        public String feed_id;
        public String feed_message;
        public String feed_image;
        public String feed_time;
        public String feed_description;
        public String feed_link;
        public String type;
        public boolean isLiked = false;
        public FeedItem(int likesCount, String page_id, String page_title, String page_thum, String feed_id, String feed_message, String feed_description, String feed_image, String feed_link, String feed_time, String type) {
            this.feed_description = feed_description;
            this.likesCount = likesCount;
            this.page_id = page_id;
            this.page_title = page_title;
            this.page_thum = page_thum;
            this.feed_id = feed_id;
            this.feed_message = feed_message;
            this.feed_image = feed_image;
            this.feed_link = feed_link;
            this.feed_time = feed_time;
            this.type = type;
        }
    }

    public interface OnFeedItemClickListener {
        void onSharesClick(View v, int position);

        void onMoreClick(View v, int position);

        void onProfileClick(View v);
        void onFeedTitleClick(View v, String page_thum,
                              String page_title,
                              String feed_title,
                              String feed_image,
                              String feed_time,
                              String feed_full_desc,
                              String type,
                              String feed_link,
                              View view, boolean fa);
    }
}

Circulartransformation.java

public class CircularTransform implements Transformation {
    @Override
    public Bitmap transform(Bitmap source) {
        int size = Math.min(source.getWidth(), source.getHeight());

        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;

        Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
        if (squaredBitmap != source) {
            source.recycle();
        }

        Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());

        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
        paint.setShader(shader);
        paint.setAntiAlias(true);

        float r = size/2f;
        canvas.drawCircle(r, r, r, paint);

        squaredBitmap.recycle();
        return bitmap;
    }
    @Override
    public String key() {
        return "circle";
    }
}

参考 this 关于 "Glide vs Picasso" 的文章 -

Picasso downloads the image and stores the full-size image (in my case the image resolution was 1160*750) in the cache and whenever we ask for the same image, it will return the full-size image and resize them to fit into the ImageView in real time.

On the other hand, Glide works differently. Glide downloads the image from the given URL, resize it to the size of the image view and stores it to the disk cache. So if you are loading the same image in two different sized image views, Glide will store two different copies of the same image in the cache with different resolutions. That will increase the disk cache size, but it has some of its own benefits. We will see that in the next section.

可能是因为您要为每个列表项重新加载大量图像,这会影响 RecyclerView 的滚动性能。也许您可以试试 Glide,如果它能解决问题,请告诉我们?

你有:

public class fa extends RecyclerView.Adapter<RecyclerView.ViewHolder>

和:

public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position)

而且,您的 ViewHolder 是:

public static class CellFeedViewHolder extends RecyclerView.ViewHolder

我认为您应该在适配器中调用 ViewHolder (CallFeedViewHolder)。类似于:

public class fa extends RecyclerView.Adapter<fa.CellFeedViewHolder>

此外,您的 onBindViewHolder 方法应该传递您的 ViewHolder:

public void onBindViewHolder(CellFeedViewHolder holder, final int position)

你可以看到例子https://www.androidhive.info/2016/01/android-working-with-recycler-view/ and https://developer.android.com/training/material/lists-cards.html

希望对您有所帮助。

我发现了问题。感谢大家的帮助。 实际上,问题出在我的 drawable 文件夹中,我在 drawable xxxhdpi 文件夹中粘贴了占位符和另一个占位符副本,当我从 drawable 中删除了占位符时,应用程序没有抖动。 现在它工作正常。