致命异常:main:尝试在空对象引用上调用虚拟方法'int com.arewagirlcoder.welearn.GroupModel.getImage()'

时间:2018-10-21 11:40:31

标签: java android android-recyclerview nullpointerexception

我已尽我所能,但仍然无法解决问题。我也收到了最相似的问题,但是所有解决方案都无法正常工作。我正在尝试将图像从可绘制图像获取到图像视图中,但这会导致应用程序崩溃并出现空指针异常 这是我的适配器类

CloudWatch Log

这是获取图像方法

 public class GroupAdapter extends RecyclerView.Adapter<GroupAdapter.GroupHolder>{

private Context context;
private List<GroupModel> groupList;
GroupModel model;

public GroupAdapter(Context context, List<GroupModel> groupList) {
    this.context = context;
    this.groupList = groupList;
}

@NonNull
@Override
public GroupHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    return new GroupHolder(LayoutInflater.from(parent.getContext())
            .inflate(R.layout.group_item, parent, false));
}

@Override
public void onBindViewHolder(@NonNull GroupHolder holder, int position) {
    final GroupModel groupModel = groupList.get(position);
    holder.setName(groupModel.getName());
    holder.setDesc(groupModel.getDescription());
    holder.setCourse(groupModel.getCourse());
    holder.setOwner(groupModel.getOwner());
    holder.setImage(groupModel.getImage());
    holder.view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(context, GroupMessage.class);
            context.startActivity(intent);
        }
    });

}

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

public class GroupHolder extends RecyclerView.ViewHolder {

private final TextView  name;
private final TextView desc;
private final TextView course;
private final TextView owner;
private final CardView view;

private final ImageView image;

public GroupHolder(View itemView) {
    super(itemView);

            name = (TextView) itemView.findViewById(R.id.textView_grp_name );
            desc = (TextView) itemView.findViewById(R.id.textView_grp_description);
            course = (TextView) itemView.findViewById(R.id.textView_course);
            owner = (TextView) itemView.findViewById(R.id.textView_owner);
            image = (ImageView) itemView.findViewById(R.id.imageView_groups);
            view = (CardView) itemView.findViewById(R.id.group_view);
}

public void setName(String n){
    name.setText(n);
}

public void setDesc(String d){
    desc.setText(d);
}

public void setCourse(String c){
    course.setText(c);
}

public void setOwner(String o){
    owner.setText(o);
}

public void setImage(int i){
   // StorageReference reference = FirebaseStorage.getInstance().getReference().child(i);
    //Glide.with(context).load(reference).into(image);
    image.setImageDrawable(context.getResources().getDrawable(model.getImage()));
}
}
}

和错误

 public int getImage() {

    return image;
}

3 个答案:

答案 0 :(得分:1)

在设置可绘制图像之前先进行检查

 public void setImage(int i){
       // StorageReference reference = FirebaseStorage.getInstance().getReference().child(i);
        //Glide.with(context).load(reference).into(image);
        Drawable imagedrawable = context.getResources().getDrawable(i); //use i instead of model.getImage(), you are already passing the drawable int
        if(imagedrawable !=null)
            image.setImageDrawable(imagedrawable);
        else
           Log.d(TAG, "image is null");
    }

答案 1 :(得分:0)

问题是这一行:

public void setImage(int i){
   image.setImageDrawable(context.getResources().getDrawable(model.getImage()));
}

显然您的model变量未设置,我怀疑它也可能是多余的。请改用您已传递的i变量:

public void setImage(int i){
   image.setImageDrawable(context.getResources().getDrawable(i));
}

说明: 在onBindViewHolder中,您可以这样:

final GroupModel groupModel = groupList.get(position);

未设置model变量。但是实际上您确实将当前模型的图像资源传递给该方法,因此可以使用该变量。

答案 2 :(得分:0)

我相信Vucko是对的。我不知道AS怎么也不会在您的model.getImage()方法内向您抛出setImage(int i)的红色错误消息,因为我看不到任何地方声明的模型变量。 编辑: 我的错误,我看到了它的声明,但从未发现。就是你的问题。

您可以阅读有关资源和getDrawable()here的更多信息。如果他的答案不起作用,则说明您的模型对象未返回正确的可绘制资源类型。有效类型位于开发者网站的Drawable resources页面上。

如果Vucko的解决方案不起作用,请更新您对象的代码。