我有一个产品列表,里面有一个带有 CardViews 的回收视图。每个 CardView 都有一个产品的图像。
问题是我得到了一个
“java.lang.OutOfMemoryError”
. 我认为是因为我在 RecycleView 适配器中使用了毕加索。
这是代码:
import android.content.Context;
import android.support.v7.widget.RecyclerView;
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 java.util.List;
import uk.co.something.R;
import uk.co.something.Product;
public class ProductListAdapter extends RecyclerView.Adapter<ProductListAdapter.ViewHolder> {
private List<Product> products;
private int rowLayout;
private Context appContext;
public ProductListAdapter(List<Product> products, int rowLayout, Context appContext) {
this.products = products;
this.rowLayout = rowLayout;
this.appContext = appContext;
}
@Override
public ProductListAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false);
return new ProductListAdapter.ViewHolder(v);
}
@Override
public void onBindViewHolder(ProductListAdapter.ViewHolder viewHolder, int i) {
Product product = products.get(i);
Picasso.with(appContext).load(product.getUrl().getImage()).into(viewHolder.image);
Picasso.with(appContext).load(product.getRetailer().getIcon()).into(viewHolder.logo);
String productPrice = (product.getPrice().getDiscounted() == null || Double.parseDouble(product.getPrice().getDiscounted()) <= 0) ? product.getPrice().getCost() : product.getPrice().getDiscounted();
viewHolder.price.setText("\u00a3" + productPrice);
}
@Override
public int getItemCount() {
return products == null ? 0 : products.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView image;
public ImageView logo;
public TextView price;
ViewHolder(View itemView) {
super(itemView);
image = (ImageView) itemView.findViewById(R.id.product_list_cardview_image);
logo = (ImageView) itemView.findViewById(R.id.product_list_cardview_logo);
price = (TextView) itemView.findViewById(R.id.product_list_cardview_price);
}
}
}
我得到的错误是这个:
E/AndroidRuntime:致命异常:主进程:uk.co.lexel.dimble,PID:5503 java.lang.OutOfMemoryError:无法分配 11760012 字节分配,4269112 空闲字节和 4MB 直到 OOM 在 dalvik.system.VMRuntime.newNonMovableArray (本机方法)在 android.graphics.BitmapFactory.nativeDecodeAsset(本机方法)在 android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609) 在 android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444) 在 android.graphics .drawable.Drawable.createFromResourceStream(Drawable.java:1080) 在 android.content.res.Resources.loadDrawableForCookie(Resources.java:2635) 在 android.content.res.Resources.loadDrawable(Resources.java:2540) 在 android.content.res.Resources.getDrawable(Resources.java:806) 在 android.content.Context.getDrawable(Context.java:458) 在 android.support.v4.content.ContextCompatApi21.getDrawable(ContextCompatApi21 .java:30) 在 android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:202) 在 android.support.v7 的 android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:372)。 widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:190) 在 android.support.v7.content.res.AppCompatResources.getDrawable(AppCompatResources.java:100) 在 android.support.v7.widget.AppCompatImageHelper.loadFromAttributes(AppCompatImageHelper.java:54) 在 android.support.v7.widget.AppCompatImageView.(AppCompatImageView.java:56) 在 android.support.v7.app.AppCompatViewInflater.createView 的 android.support.v7.widget.AppCompatImageView.(AppCompatImageView.java:66) (AppCompatViewInflater.java:106) 在 android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1021) 在 android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1080) 在 android.support。 v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:47) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:746) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)在 android.view.LayoutInflater.rInflate(LayoutInflater.java:835) 在 android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:838) 在 android。 view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) at android.view.LayoutInflater.rInflate(LayoutInflater.java:838) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) at android.view.LayoutInflater.inflate (LayoutInflater.java:515) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:423) 在 uk.co.something.controllers.activities.ProductListAdapter.onCreateViewHolder(ProductListAdapter.java:35) 在 uk.co.something.controllers.activities.ProductListAdapter.onCreateViewHolder(ProductListAdapter.java:22) 在 android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6290) 在 android.support.v7 .widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5478) 在 android.support.v7.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:270) 在 android.support.v7.widget.GapWorker.flushTaskWithDeadline(GapWorker.java :324) 在 android.support.v7.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:337) 在 android.support.v7.widget.GapWorker.prefetch(GapWorker.java:344) 在 android.support.v7.widget。 GapWorker.run(GapWorker.java:370) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android。 app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com. android.internal.os.ZygoteInit.main(ZygoteInit.java:616)5417) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main( ZygoteInit.java:616)5417) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main( ZygoteInit.java:616)
在日志中说问题出在这里:
View v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false);
有人能帮我吗?