Android毕加索Recyclerview图像下载速度慢
我有无数的recyclerview,几乎模仿Instagram列表/订阅源。其中图像加载到全屏宽度的Imageview中。我正在使用毕加索加载图像。这是我的密码: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;
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);