0

I'm trying to run this successfully but keeping getting null pointer exectpion error. I've included the adapter and activity related. I'm self taught so any tips or guidelines are greatly appreciated. It keeps pointing to:

"public int getItemCount() { return foodList.size();}"

I don't see any errors on the page so I'm at a loss as to where to look

Food List Adapter

public class FoodListAdapter extends RecyclerView.Adapter<FoodListAdapter.MyViewHolder> {

    private List<Foods> foodList;
    private FoodListClickListener clickListener;

    public FoodListAdapter(List<Foods> foodList, FoodListClickListener clickListener) {

        this.foodList = foodList;
        this.clickListener = clickListener;
    }

    public void updateData(List<Foods> foodList) {
        this.foodList = foodList;
        notifyDataSetChanged();

    }

    @NonNull
    @Override
    public FoodListAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view  = LayoutInflater.from(parent.getContext()).inflate(R.layout.menu_recycler_row, parent, false);
        return  new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull FoodListAdapter.MyViewHolder holder, int position) {
        holder.menuName.setText(foodList.get(position).getName());
        holder.menuPrice.setText("Price: $"+foodList.get(position).getPrice());
        holder.addToCartButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Foods food  = foodList.get(position);
                food.setTotalInCart(1);
                clickListener.onAddToCartClick(food);
                holder.addMoreLayout.setVisibility(View.VISIBLE);
                holder.addToCartButton.setVisibility(View.GONE);
                holder.tvCount.setText(food.getTotalInCart()+"");
            }
        });
        holder.imageMinus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Foods food  = foodList.get(position);
                int total = food.getTotalInCart();
                total--;
                if(total > 0 ) {
                    food.setTotalInCart(total);
                    clickListener.onUpdateCartClick(food);
                    holder.tvCount.setText(total +"");
                } else {
                    holder.addMoreLayout.setVisibility(View.GONE);
                    holder.addToCartButton.setVisibility(View.VISIBLE);
                    food.setTotalInCart(total);
                    clickListener.onRemoveFromCartClick(food);
                }
            }
        });

        holder.imageAddOne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Foods food  = foodList.get(position);
                int total = food.getTotalInCart();
                total++;
                if(total <= 10 ) {
                    food.setTotalInCart(total);
                    clickListener.onUpdateCartClick(food);
                    holder.tvCount.setText(total +"");
                }
            }
        });

        Glide.with(holder.thumbImage)
                .load(foodList.get(position).getUrl())
                .into(holder.thumbImage);

    }


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

    static class MyViewHolder extends RecyclerView.ViewHolder {
        TextView  menuName;
        TextView  menuPrice;
        TextView  addToCartButton;
        ImageView thumbImage;
        ImageView imageMinus;
        ImageView imageAddOne;
        TextView  tvCount;
        LinearLayout addMoreLayout;

        public MyViewHolder(View view) {
            super(view);
            menuName = view.findViewById(R.id.menuName1);
            menuPrice = view.findViewById(R.id.menuPrice1);
            addToCartButton = view.findViewById(R.id.addToCartButton1);
            thumbImage = view.findViewById(R.id.thumbImage1);
            imageMinus = view.findViewById(R.id.imageMinus1);
            imageAddOne = view.findViewById(R.id.imageAddOne1);
            tvCount = view.findViewById(R.id.tvCount1);
            addMoreLayout  = view.findViewById(R.id.addMoreLayout1);
        }
    }

    public interface FoodListClickListener {
        public void onAddToCartClick(Foods food);
        public void onUpdateCartClick(Foods food);
        public void onRemoveFromCartClick(Foods food);
    }
}

Stacktrace

 java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
        at com.example.kimsteahouse.adapters.FoodListAdapter.getItemCount(FoodListAdapter.java:100)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:4044)
        at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3534)
        at android.view.View.measure(View.java:19734)
        at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:811)
        at androidx.constraintlayout.core.widgets.analyzer.BasicMeasure.measure(BasicMeasure.java:466)
        at androidx.constraintlayout.core.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:134)
        at androidx.constraintlayout.core.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:278)
        at androidx.constraintlayout.core.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:120)

FoodModel


public class Foods implements Parcelable{
    private String name;
    private float price;
    private String url;
    private int totalInCart;


    public int getTotalInCart() { return totalInCart; }

    public void setTotalInCart(int totalInCart) {
        this.totalInCart = totalInCart;
    }


    protected Foods(Parcel in) {
        name = in.readString();
        price = in.readFloat();
        url = in.readString();
        totalInCart = in.readInt();

    }

    public static final Creator<Foods> CREATOR = new Creator<Foods>() {
        @Override
        public Foods createFromParcel(Parcel in) {
            return new Foods(in);
        }

        @Override
        public Foods[] newArray(int size) {
            return new Foods[size];
        }
    };


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeFloat(price);
        dest.writeString(url);
        dest.writeInt(totalInCart);

    }
}

Related activity




    public  class RestaurantMenuActivity extends AppCompatActivity implements 
    DrinkListAdapter.DrinkListClickListener,FoodListAdapter.FoodListClickListener{
    private DrinkListAdapter drinkListAdapter;
    private FoodListAdapter foodListAdapter;
    private List<Drinks> itemsInCartList;
    private List<Foods> itemsInCartList1;
    private int totalItemInCart = 0;
    private TextView buttonCheckout;
    private List<Drinks> drinkList;
    private List<Foods> foodList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_restaurant_menu);

        RestaurantModel restaurantModel = getIntent().getParcelableExtra("RestaurantModel");
        ActionBar actionBar = getSupportActionBar();
        actionBar.setTitle(restaurantModel.getName());
        actionBar.setSubtitle(restaurantModel.getAddress());
        actionBar.setDisplayHomeAsUpEnabled(true);



        drinkList = restaurantModel.getDrinks();
        initRecyclerView();

        foodList = restaurantModel.getFoods();
        initRecyclerView();


         buttonCheckout = findViewById(R.id.buttonCheckout);
         buttonCheckout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(itemsInCartList1 != null && itemsInCartList1.size() <= 0) {
                    Toast.makeText(RestaurantMenuActivity.this, "Please add some items in cart.", Toast.LENGTH_SHORT).show();
                    return;
                }
                restaurantModel.setFoods(itemsInCartList1);
                Intent i = new Intent(RestaurantMenuActivity.this, PlaceYourOrderActivity.class);
                i.putExtra("RestaurantModel", restaurantModel);
                startActivityForResult(i, 1000);
            }
        });
    }

    private void initRecyclerView() {
        RecyclerView recyclerView =  findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
        DrinkListAdapter drinkListAdapter = new DrinkListAdapter(drinkList, (DrinkListAdapter.DrinkListClickListener) this);
        recyclerView.setAdapter(drinkListAdapter);
        FoodListAdapter foodListAdapter = new FoodListAdapter(foodList, (FoodListAdapter.FoodListClickListener) this);
        recyclerView.setAdapter(foodListAdapter);
    }


    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home :
                finish();
            default:
                //do nothing
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == 1000 && resultCode == Activity.RESULT_OK) {
            //
            finish();
        }
    }

    @Override
    public void onAddToCartClick(Drinks drinks) {
        if(itemsInCartList == null) {
            itemsInCartList = new ArrayList<>();
        }
        itemsInCartList.add(drinks);
        totalItemInCart = 0;


        for(Drinks d : itemsInCartList) {
            totalItemInCart = totalItemInCart + d.getTotalInCart();
        }

        buttonCheckout.setText("Checkout (" +totalItemInCart +") items");
    }


    @Override
    public void onUpdateCartClick(Drinks drinks) {
        if(itemsInCartList.contains(drinks)) {
            int index = itemsInCartList.indexOf(drinks);
            itemsInCartList.remove(index);
            itemsInCartList.add(index, drinks);
            totalItemInCart = 0;
            for(Drinks d : itemsInCartList) {
                totalItemInCart = totalItemInCart + d.getTotalInCart();
            }
            buttonCheckout.setText("Checkout (" +totalItemInCart +") items");
        }

    }

    @Override
    public void onRemoveFromCartClick(Drinks drinks) {
        if(itemsInCartList.contains(drinks)) {
            itemsInCartList.remove(drinks);
            totalItemInCart = 0;
            for(Drinks d : itemsInCartList) {
                totalItemInCart = totalItemInCart + d.getTotalInCart();
            }
            buttonCheckout.setText("Checkout (" +totalItemInCart +") items");
        }
    }

    @Override
    public void onAddToCartClick(Foods food) {
        if(itemsInCartList == null) {
            itemsInCartList = new ArrayList<>();
        }

        itemsInCartList1.add(food);
        totalItemInCart = 0;

        for(Foods f : itemsInCartList1) {
            totalItemInCart = totalItemInCart + f.getTotalInCart();
        }
        buttonCheckout.setText("Checkout (" +totalItemInCart +") items");
    }

    @Override
    public void onUpdateCartClick(Foods food) {
        if(itemsInCartList1.contains(food)) {
            int index = itemsInCartList1.indexOf(food);
            itemsInCartList1.remove(index);
            itemsInCartList1.add(index, food);
            totalItemInCart = 0;
            for(Foods f : itemsInCartList1) {
                totalItemInCart = totalItemInCart + f.getTotalInCart();
            }
            buttonCheckout.setText("Checkout (" +totalItemInCart +") items");
        }
    }

    @Override
    public void onRemoveFromCartClick(Foods food) {
        if(itemsInCartList1.contains(food)) {
            itemsInCartList1.remove(food);
            totalItemInCart = 0;
            for(Foods f : itemsInCartList1) {
                totalItemInCart = totalItemInCart + f.getTotalInCart();
            }
            buttonCheckout.setText("Checkout (" +totalItemInCart +") items");
        }

    }
}
  • i looked at that earlier but couldn't relate it to my code – rebel2theworld Nov 06 '21 at 01:31
  • 2
    In general, when you pass a value to a constructor which must not be null but is only used later, check it in the constructor, so that you can identify the problem at the place it is caused. – tgdavies Nov 06 '21 at 01:33
  • are you referring to the foodmodel? – rebel2theworld Nov 06 '21 at 01:38
  • 3
    @rebel2theworld: 1) Please read the replies [here](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it). This should help you troubleshoot NPEs in general. 2) It looks like your NPE is coming from `FoodListAdapter.getItemCount()`. This probably means that your FoodListAdapter's constructor was called with a null `foodList`. Use your debugger. Set a breakpoint in the code that creates the FoodListAdapter, and ensure "foodList" is initialized at that point. – paulsm4 Nov 06 '21 at 01:58
  • i'm still lost as to what to do here even after reading the notes.. – rebel2theworld Nov 06 '21 at 20:48

0 Answers0