如何防止Picasso在RecyclerView中重新加载图片?

时间:2015-10-02 14:35:10

标签: android listview android-recyclerview picasso

我是使用RecyclerView和Picasso的新手。 基本上,我尝试做的是 - 将推文列表传递给适配器。在OnBind()方法中,我使用Picasso将图像加载到每张卡上(如果存在)。 当我向上和向下滚动时,之前加载图像的卡片会闪烁并重新加载图像。文字没有闪烁。闪烁只发生在图像的情况下。

我尝试在recyclerview对象上使用setItemViewCacheSize(int size)。此功能缓存指定数量的项目,并为我提供了我正在寻找的流畅的用户体验。但是我注意到它导致了一个" outOfMemory"错误。

我错过了RecyclerView或Picasso文档中的某些内容吗?

TweetsAdapter.java

package com.umangmathur.mynewtwitterclone;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import com.twitter.sdk.android.core.models.MediaEntity;
import com.twitter.sdk.android.core.models.Tweet;
import java.util.List;

public class TweetsAdapter extends RecyclerView.Adapter<TweetsAdapter.TweetHolder> {

    private List<Tweet> tweetList;

    public TweetsAdapter(List<Tweet> tweetList) {
        this.tweetList = tweetList;
    }

    @Override
    public TweetHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.tweet_layout, parent, false);
        return new TweetHolder(view);
    }

    @Override
    public void onBindViewHolder(TweetHolder holder, int position) {
        Context context = holder.itemView.getContext();
        Tweet tweet = tweetList.get(position);
        holder.txtTweet.setText(tweet.text);
        List<MediaEntity> mediaEntityList = tweet.entities.media;
        if (mediaEntityList != null) {
            String mediaUrl = mediaEntityList.get(0).mediaUrl;
            Picasso.with(context).load(mediaUrl).into(holder.imgTweet);
        } else {
            holder.imgTweet.setImageDrawable(null);
        }
    }

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

    public class TweetHolder extends ViewHolder {

        private TextView txtTweet;
        private ImageView imgTweet;

        public TweetHolder(View itemView) {
            super(itemView);
            this.txtTweet = (TextView) itemView.findViewById(R.id.tweetText);
            this.imgTweet = (ImageView) itemView.findViewById(R.id.imgTweet);
        }
    }

}

0 个答案:

没有答案