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;