Android毕加索Recyclerview图像下载速度慢

Android毕加索Recyclerview图像下载速度慢,android,android-recyclerview,android-adapter,picasso,android-lazyloading,Android,Android Recyclerview,Android Adapter,Picasso,Android Lazyloading,我有无数的recyclerview,几乎模仿Instagram列表/订阅源。其中图像加载到全屏宽度的Imageview中。我正在使用毕加索加载图像。这是我的密码: public class HomeAdapter extends RecyclerView.Adapter { Context context; private Contract contract; List<Feed> feeds; static final int ITEM_TYPE_HEADER = 0;

我有无数的recyclerview,几乎模仿Instagram列表/订阅源。其中图像加载到全屏宽度的Imageview中。我正在使用毕加索加载图像。这是我的密码:

public class HomeAdapter extends RecyclerView.Adapter {

Context context;

private Contract contract;

List<Feed> feeds;

static final int ITEM_TYPE_HEADER = 0;

static final int ITEM_TYPE_LOAD_MORE = 1;

static final int ITEM_TYPE_DESIGN = 2;

public HomeAdapter(Context context, List<Feed> feeds) {
    this.context = context;
    this.feeds = feeds;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View row;
    if (viewType == ITEM_TYPE_HEADER) {
        row = inflater.inflate(R.layout.list_item_home_header, parent, false);
        return new HeaderHolder(row);
    } else if (viewType == ITEM_TYPE_LOAD_MORE) {
        row = inflater.inflate(R.layout.list_item_load_more, parent, false);
        return new LoadMoreHolder(row);
    } else if (viewType == ITEM_TYPE_DESIGN) {
        row = inflater.inflate(R.layout.list_item_feed_home, parent, false);
        return new DesignItemHolder(row);
    }
    return null;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
    Feed feed = feeds.get(position);
    if (holder instanceof HeaderHolder) {
        HeaderHolder headerHolder = (HeaderHolder) holder;
        Header header = (Header) feed;
        headerHolder.tvTitle.setText(header.getTitle());
        headerHolder.tvDescription.setText(header.getDescription());

    } else if (holder instanceof LoadMoreHolder) {
        LoadMoreHolder loadMoreHolder = (LoadMoreHolder) holder;
        LoadMore loadMore = (LoadMore) feed;
        if(loadMore.getType() == LOAD_MORE_TYPE_PROGRESS) {
            loadMoreHolder.pbLoadMore.setVisibility(View.VISIBLE);
            loadMoreHolder.rlMessageRetry.setVisibility(View.GONE);
        } else {
            loadMoreHolder.pbLoadMore.setVisibility(View.GONE);
            loadMoreHolder.rlMessageRetry.setVisibility(View.VISIBLE);
            if(StringUtils.isValid(loadMore.getTitle())) {
                loadMoreHolder.tvTitle.setText(loadMore.getTitle());
                loadMoreHolder.tvTitle.setVisibility(View.VISIBLE);
            } else
                loadMoreHolder.tvTitle.setVisibility(View.GONE);

            if(StringUtils.isValid(loadMore.getDescription())) {
                loadMoreHolder.tvDescription.setText(loadMore.getDescription());
                loadMoreHolder.tvDescription.setVisibility(View.VISIBLE);
            } else
                loadMoreHolder.tvDescription.setVisibility(View.GONE);
        }

        loadMoreHolder.btnRetry.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(contract != null)
                    contract.onRetryLoadMoreClick();
            }
        });

    } else if (holder instanceof DesignItemHolder) {
        final DesignItemHolder designItemHolder = (DesignItemHolder) holder;
        final DesignFeed designFeed = (DesignFeed) feed;
        String title = getFeedTitle(designFeed.getDesignCategory().getTitle(), designFeed.getEvent().getTitle());
        designItemHolder.tvCategory.setText(StringUtils.toUpperCaseSentence(designFeed.getDesignCategory().getTitle()));
        designItemHolder.tvDate.setText(DateTimeUtils.formatTime(designFeed.getDate()));
        designItemHolder.tvTitle.setText(StringUtils.toUpperCaseSentence(title));
        designItemHolder.tvBrand.setText(getBrandTitle(designFeed.getBrand().getTitle()));

        if(StringUtils.isValid(designFeed.getShopLink())) {
            designItemHolder.tvShop.setVisibility(View.VISIBLE);
            if(StringUtils.isValid(designFeed.getPrice())) {
                designItemHolder.tvPrice.setVisibility(View.VISIBLE);
                designItemHolder.tvPrice.setText(designFeed.getPrice() + " PKR");
            } else
                designItemHolder.tvPrice.setVisibility(View.GONE);

            designItemHolder.tvShop.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if(contract != null)
                        contract.onOpenShopLink(designFeed.getShopLink());
                }
            });
        }
        else {
            designItemHolder.tvPrice.setVisibility(View.GONE);
            designItemHolder.tvShop.setVisibility(View.GONE);
        }

        showFeedImage(designFeed, designItemHolder.ivThumbnail, designItemHolder.progressBar);

        Picasso.get()
                .load(designFeed.getDesignCategory().getThumbnail())
                .transform(new CircleTransform())
                .placeholder(new ColorDrawable(ContextCompat.getColor(context, R.color.colorGreyLight)))
                .into(designItemHolder.ivCategory);

        designItemHolder.ivThumbnail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(contract != null)
                    contract.onDesignFeedClick(designFeed);
            }
        });

        designItemHolder.tvCategory.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(contract != null)
                    contract.onDesignCategoryClick(designFeed.getDesignCategory());
            }
        });

        designItemHolder.ivCategory.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(contract != null)
                    contract.onDesignCategoryClick(designFeed.getDesignCategory());
            }
        });

        designItemHolder.tvTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(contract != null)
                    contract.onDesignCategoryClick(designFeed.getDesignCategory());
            }
        });

        designItemHolder.tvBrand.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(contract != null)
                    contract.onBrandClick(designFeed.getBrand());
            }
        });

        designItemHolder.ibFavourite.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(contract != null)
                    contract.onFavouriteClick(designFeed);
            }
        });

        designItemHolder.ibShare.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(contract != null)
                    contract.onShareClick(designFeed);
            }
        });

        designItemHolder.ibDownload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(contract != null)
                    contract.onDownloadClick(designFeed);
            }
        });
    }
}

private void showFeedImage(final DesignFeed designFeed, final ImageView ivThumbnail, final ProgressBar progressBar) {
    Picasso.get()
            .load(designFeed.getThumbnail())
            .placeholder(new ColorDrawable(ContextCompat.getColor(context, R.color.colorGreyLight)))
            .networkPolicy(NetworkPolicy.OFFLINE)
            .into(ivThumbnail, new Callback() {
                @Override
                public void onSuccess() {
                }

                @Override
                public void onError(Exception e) {
                    //Try again online if cache failed
                    Picasso.get()
                            .load(designFeed.getThumbnail())
                            .placeholder(new ColorDrawable(ContextCompat.getColor(context, R.color.colorGreyLight)))
                            .into(ivThumbnail, new Callback() {
                                @Override
                                public void onSuccess() {
                                }

                                @Override
                                public void onError(Exception e) {

                                }
                            });
                }
            });
}

@Override
public int getItemViewType(int position) {
    Feed feed = feeds.get(position);
    if (feed instanceof Header)
        return ITEM_TYPE_HEADER;
    else if (feed instanceof LoadMore)
        return ITEM_TYPE_LOAD_MORE;
    else if (feed instanceof DesignFeed)
        return ITEM_TYPE_DESIGN;
    else
        return super.getItemViewType(position);
}

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

public void insertFeedAtStart(Feed feed) {
    feeds.add(0, feed);
    notifyDataSetChanged();
}

public void updateFeeds(ArrayList<Feed> mFeeds) {
    feeds.addAll(mFeeds);
    notifyDataSetChanged();
}

public void addLoadMoreItem(Feed loadMoreFeed) {
    feeds.add(loadMoreFeed);
    notifyItemInserted(getItemCount() - 1);
}

public void removeItem(int index) {
    feeds.remove(index);
    notifyDataSetChanged();
}

private class DesignItemHolder extends RecyclerView.ViewHolder {
    TextView tvTitle, tvCategory, tvBrand, tvDate, tvPrice, tvShop;
    ImageView ivCategory, ivThumbnail;
    ImageButton ibFavourite, ibShare, ibDownload;
    ProgressBar progressBar;

    DesignItemHolder(View itemView) {
        super(itemView);
        tvTitle = itemView.findViewById(R.id.tvTitle);
        tvCategory = itemView.findViewById(R.id.tvCategory);
        tvBrand = itemView.findViewById(R.id.tvBrand);
        tvDate = itemView.findViewById(R.id.tvDate);
        ivCategory = itemView.findViewById(R.id.ivCategory);
        ivThumbnail = itemView.findViewById(R.id.ivThumbnail);
        tvPrice = itemView.findViewById(R.id.tvPrice);
        tvShop = itemView.findViewById(R.id.tvShop);
        ibFavourite = itemView.findViewById(R.id.ibFavourite);
        ibShare = itemView.findViewById(R.id.ibShare);
        ibDownload = itemView.findViewById(R.id.ibDownload);
        progressBar = itemView.findViewById(R.id.progressBar);
    }
}

private class HeaderHolder extends RecyclerView.ViewHolder {
    TextView tvTitle, tvDescription;
    HeaderHolder(View itemView) {
        super(itemView);
        tvTitle = itemView.findViewById(R.id.tvTitle);
        tvDescription = itemView.findViewById(R.id.tvDescription);
    }
}

private class LoadMoreHolder extends RecyclerView.ViewHolder {
    ProgressBar pbLoadMore;
    RelativeLayout rlMessageRetry;
    TextView tvTitle, tvDescription;
    AppCompatButton btnRetry;

    LoadMoreHolder(View itemView) {
        super(itemView);
        pbLoadMore = itemView.findViewById(R.id.pbLoadMore);
        rlMessageRetry = itemView.findViewById(R.id.rlMessageRetry);
        tvTitle = itemView.findViewById(R.id.tvTitle);
        tvDescription = itemView.findViewById(R.id.tvDescription);
        btnRetry = itemView.findViewById(R.id.btnRetry);
    }
}

public void setContract(Contract contract) {
    this.contract = contract;
}

public interface Contract {

    void onDesignCategoryClick(DesignCategory designCategory);

    void onDesignFeedClick(DesignFeed designCategory);

    void onBrandClick(Brand brand);

    void onRetryLoadMoreClick();

    void onShopClick(String shopLink);

    void onFavouriteClick(DesignFeed designFeed);

    void onShareClick(DesignFeed designFeed);

    void onDownloadClick(DesignFeed designFeed);

    void onOpenShopLink(String shopLink);
}
公共类HomeAdapter扩展了RecyclerView.Adapter{ 语境; 私人合同; 列表提要; 静态最终整数项\类型\标题=0; 静态最终整型项目\类型\负载\更多=1; 静态最终int项目类型设计=2; 公共HomeAdapter(上下文、列表源){ this.context=上下文; this.feed=feed; } @凌驾 public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){ LayoutInflater充气器=LayoutInflater.from(parent.getContext()); 查看行; if(视图类型==项目类型标题){ 行=充气机。充气(R.layout.list\u item\u home\u header,parent,false); 返回新的HeaderHolder(世界其他地区); }else if(viewType==项目类型加载更多){ 行=充气机。充气(R.layout.list\u item\u load\u more,父项,false); 返回新的LoadMoreHolder(世界其他地区); }else if(viewType==项目类型设计){ 行=充气机。充气(R.layout.list\u item\u feed\u home,parent,false); 返回新的DesignItemHolder(世界其他地区); } 返回null; } @凌驾 public void onBindViewHolder(RecyclerView.ViewHolder,最终int位置){ 进给=进给。获取(位置); if(头部支架的支架实例){ HeaderHolder HeaderHolder=(HeaderHolder)支架; 页眉=(页眉)提要; headerHolder.tvTitle.setText(header.getTitle()); headerHolder.tvDescription.setText(header.getDescription()); }else if(装载机的保持架实例MORE保持架){ LoadMoreHolder LoadMoreHolder=(LoadMoreHolder)holder; LoadMore LoadMore=(LoadMore)提要; if(loadMore.getType()==加载更多类型进度){ loadMoreHolder.pbLoadMore.setVisibility(View.VISIBLE); loadMoreHolder.rlMessageRetry.setVisibility(View.GONE); }否则{ loadMoreHolder.pbLoadMore.setVisibility(View.GONE); loadMoreHolder.rlMessageRetry.setVisibility(View.VISIBLE); if(StringUtils.isValid(loadMore.getTitle())){ loadMoreHolder.tvTitle.setText(loadMore.getTitle()); loadMoreHolder.tvTitle.setVisibility(View.VISIBLE); }否则 loadMoreHolder.tvTitle.setVisibility(View.GONE); if(StringUtils.isValid(loadMore.getDescription())){ loadMoreHolder.tvDescription.setText(loadMore.getDescription()); loadMoreHolder.tvDescription.setVisibility(View.VISIBLE); }否则 loadMoreHolder.tvDescription.setVisibility(View.GONE); } loadMoreHolder.btnRetry.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图){ 如果(合同!=null) contract.onRetryLoadMoreClick(); } }); }else if(设计项持有者实例){ 最终设计项目持有人DesignItemHolder=(DesignItemHolder)持有人; 最终设计提要设计提要=(设计提要)提要; 字符串title=getFeedTitle(designFeed.getDesignCategory().getTitle(),designFeed.getEvent().getTitle()); designItemHolder.tvCategory.setText(StringUtils.ToUpperCaseStation(designFeed.getDesignCategory().getTitle()); designItemHolder.tvDate.setText(DateTimeUtils.formatTime(designFeed.getDate()); designItemHolder.tvTitle.setText(StringUtils.touppercasesenting(title)); designItemHolder.tvBrand.setText(getBrandTitle(designFeed.getBrand().getTitle()); if(StringUtils.isValid(designFeed.getShopLink())){ designItemHolder.tvShop.setVisibility(View.VISIBLE); if(StringUtils.isValid(designFeed.getPrice())){ designItemHolder.tvPrice.setVisibility(View.VISIBLE); designItemHolder.tvPrice.setText(designFeed.getPrice()+“PKR”); }否则 designItemHolder.tvPrice.setVisibility(View.GONE); designItemHolder.tvShop.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图){ 如果(合同!=null) contract.onOpenShopLink(designFeed.getShopLink()); } }); } 否则{ designItemHolder.tvPrice.setVisibility(View.GONE); designItemHolder.tvShop.setVisibility(View.GONE); } showFeedImage(designFeed、designItemHolder.iv缩略图、designItemHolder.progressBar); 毕加索 .load(designFeed.getDesignCategory().getThumbnail()) .transform(新的CircletTransform()) .placeholder(新的ColorDrawable(ContextCompat.getColor(context,R.color.colorGreyLight))) .进入(designItemHolder.ivCategory); designItemHolder.ivThumbnail.setOnClickListener(新视图.OnClickListener()){ @凌驾 公共void onClick(视图){ 如果(合同!=null) contract.ondesignfeed单击(designFeed); } }); designItemHolder.tvCategory.setOnClickListener(新视图.OnClickListener()){ @凌驾 公共void onClick(视图){ 如果(合同!=null) contract.onDesignCategoryClick(designFeed.getDesignCategory()); } }); designItemHolder.ivCategory.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图){ 如果(合同!=null) contract.onDesignCategoryClick(designFeed.getDesignCategory()); } }); designItemHolder.tvTitle.setOnClickListener(新视图.OnClickListener(){ @凌驾 酒吧
    .load(designFeed.getDesignCategory().getThumbnail())
    .transform(new CircleTransform())
    .placeholder(new ColorDrawable(ContextCompat.getColor(context, 
     R.color.colorGreyLight)))
    .into(designItemHolder.ivCategory);
Picasso.get()
        .load(designFeed.getDesignCategory().getThumbnail())
        .transform(new CircleTransform())
        .placeholder(new ColorDrawable(ContextCompat.getColor(context, R.color.colorGreyLight)))
        .into(designItemHolder.ivCategory);
public class HomeAdapter extends RecyclerView.Adapter {

Context context;
private final CircleTransform circleTransform;
private final ColorDrawable placeholderDrawable;

.
.
.

public HomeAdapter(Context context, List<Feed> feeds) {
    this.context = context;
    this.feeds = feeds;
    this.circleTransform = new CircleTransform();
    this.placeholderDrawable = new ColorDrawable(ContextCompat.getColor(context, R.color.colorGreyLight))
}
Picasso.get()
        .load(designFeed.getDesignCategory().getThumbnail())
        .transform(circleTransform)
        .placeholder(placeholderDrawable)
        .into(designItemHolder.ivCategory);