NULL POINTER EXCEPTION HAPPENDS HEREI have 2 recyclerviews and 2 adapters. One is for the shop names, and one for the deliverables per shop. I need to display the deliverables per shop. When I populate my layout component, deliverable imageview returns null.
Here is my code for populating the recyclerview of the deliverables.
public class DeliverableView extends ConstraintLayout {
    @BindView(R.id.iv_deliverable_image)
    ImageView iv_deliverable_image;
    @BindView(R.id.tv_deliverable_name)
    TextView tv_deliverable_name;
    @BindView(R.id.tv_deliverable_size)
    TextView tv_deliverable_size;
    @BindView(R.id.tv_deliverable_quantity)
    TextView tv_deliverable_quantity;
    @BindView(R.id.tv_deliverable_amount)
    TextView tv_deliverable_amount;
    public DeliverableView(Context context) {
        super(context);
    }
    public DeliverableView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public DeliverableView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    public void populate(Entity deliverable) {
        Glide.with(getContext()).load(StringUtil.trimUrlByHeight(deliverable.attributes.image_url, 60)).into(iv_deliverable_image);
        tv_deliverable_quantity.setText(String.valueOf(deliverable.attributes.count));
        tv_deliverable_name.setText(deliverable.attributes.name);
        tv_deliverable_size.setText(deliverable.attributes.size);
        tv_deliverable_amount.setText(StringUtil.getDisplayedBill(deliverable.attributes.amount_in_cents * deliverable.attributes.count));
    }
    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        View.inflate(getContext(), R.layout.layout_componet_deliverable, this);
        ButterKnife.bind(this);
    }
}
Below is the code for the adapter of shops. This is where I setup the deliverableadapter and updating it.
public class ViewReceiptShopNameAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context context;
    private LayoutInflater inflater;
    private List<Entity> jobOrders = new ArrayList<>();
    private DeliverableAdapter deliverableAdapter;
    private List<OrderItem> orderItems = new ArrayList<>();v
    public ViewReceiptShopNameAdapter(Context context) {
        this.context = context;
        this.inflater = LayoutInflater.from(context);
    }
    public void updateViewShopAdapter(List<Entity> jobOrders) {
        this.jobOrders = jobOrders;
        notifyDataSetChanged();
    }
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
        return new ViewHolderShopName(inflater.inflate(R.layout.layout_view_receipt_shopname, parent, false));
    }
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        final Entity jobOrder = jobOrders.get(position);
//        final OrderItem orderItemList = orderItems.get(position);
        ViewHolderShopName viewHolder = (ViewHolderShopName) holder;
        viewHolder.bindModel(jobOrder);
    }
    @Override
    public int getItemCount() {
        return jobOrders.size();
    }
    class ViewHolderShopName extends RecyclerView.ViewHolder {
        @BindView(R.id.store_name)
        TextView tv_shop_name;
        @BindView(R.id.count_items_delivered)
        TextView tv_items_count;
        @BindView(R.id.rv_receipt_items)
        RecyclerView rv_receipt_items;
        ViewHolderShopName(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
        void bindModel(Entity jobOrder) {
//            tv_shop_name.setText(orderItem.shop.attributes.name);
            tv_items_count.setText(String.format("%d items delivered", jobOrder.attributes.deliverables_purchased_count));
            //deliverable adapter
            LinearLayoutManager layoutManager = new LinearLayoutManager(context);
            layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
            rv_receipt_items.setLayoutManager(layoutManager);
            deliverableAdapter = new DeliverableAdapter(context);
            rv_receipt_items.setAdapter(deliverableAdapter);
            deliverableAdapter.updateDeliverableAdapter(Arrays.asList(jobOrder.relationships.deliverables.data));
        }
    }
}
This is the DeliverableAdapter.class where I am calling the updateDeliverableAdapter() method.
public class DeliverableAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context context;
    private LayoutInflater inflater;
    private List<Entity> deliverables = new ArrayList<>();
    public DeliverableAdapter(Context context) {
        this.context = context;
        this.inflater = LayoutInflater.from(context);
    }
    public void updateDeliverableAdapter(List<Entity> deliverables) {
        this.deliverables = deliverables;
        notifyDataSetChanged();
    }
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, final int viewType) {
        return new ViewHolderDeliverable(inflater.inflate(R.layout.layout_item_deliverable, parent, false));
    }
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        final Entity deliverable = deliverables.get(position);
        ViewHolderDeliverable viewHolder = (ViewHolderDeliverable) holder;
        viewHolder.bindModel(deliverable);
    }
    @Override
    public int getItemCount() {
        return deliverables.size();
    }
    class ViewHolderDeliverable extends RecyclerView.ViewHolder {
        @BindView(R.id.deliverableView)
        DeliverableView deliverableView;
        ViewHolderDeliverable(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
        void bindModel(Entity deliverable) {
            deliverableView.populate(deliverable);
        }
    }
}
This is my Entity.class . I checked AttributesBase includes the need data.
public class Entity implements BaseModel{
    public String id;
    public String type;
    public AttributesBase attributes;
    public RelationshipsBase relationships;
    public boolean isCancelled(){
        return attributes.status.equalsIgnoreCase("cancelled");
    }
    @Override
    public String toString() {
        return new Gson().toJson(this);
    }
    @Override
    public int hashCode() {
        return toString().hashCode();
    }
}
These are the ATTRIBUTES I am accessing on the AttributesBase.class.
@SerializedName("image-url") public String image_url; @SerializedName("name") public String name; public String size; public int count;
 
     
    