使用Picasso从Firebase加载图片到CardView时context为空无法显示怎么办
问题根因
你的DogUserAdapter构造方法没有接收外部传入的Context参数,构造方法内this.context = context一行右侧的context是未初始化的类成员变量,默认值为null,因此Picasso拿到空上下文无法完成图片加载。
修复方案
方案1:调整构造方法新增Context参数
修改Adapter的构造逻辑,在实例化时由调用方(Activity/Fragment)传入合法Context:
第一步:修改DogUserAdapter构造方法
// 新增Context参数 public DogUserAdapter(@NonNull FirebaseRecyclerOptions<Dog> options, @NonNull Context context, @NonNull final DogCallback dogCallback) { super(options); this.dogCallback = dogCallback; this.context = context; // 此时右侧context为传入的参数,有效 }
第二步:实例化Adapter时传入Context
在你初始化Adapter的Activity/Fragment中,传入当前上下文:
// Activity中初始化示例 DogUserAdapter adapter = new DogUserAdapter(options, MainActivity.this, new DogUserAdapter.DogCallback() { @Override public void onCardViewClick(Dog dog) { // 原有点击逻辑 } }); // Fragment中初始化则传入getContext()即可
方案2:无需声明Context成员变量,直接用View自带上下文
更简化的方案,不需要额外传参,直接在Picasso调用处拿ViewHolder控件的上下文即可,可以删掉类中的private Context context;成员变量:
@Override protected void onBindViewHolder(@NonNull DogViewHolder holder, int position, @NonNull Dog model) { holder.dogName.setText(model.getName()); // 直接用holder.itemView的上下文,不需要额外维护context变量 Picasso.with(holder.itemView.getContext()) .load(model.getImageUrl()) .into(holder.dogImage); holder.cardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dogCallback.onCardViewClick(model); } }); }
优化建议
如果你使用的Picasso版本较新,建议替换为Picasso.get()的调用方式,Picasso.with(context)是旧版本API,新版本已经不需要每次传入Context参数。
内容的提问来源于stack exchange,提问作者Caitlin
相关产品推荐
相关产品推荐

