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");
}
}
}