I am trying to have a button delete a certain item from the list depending on the ID of the item, I've added a delete button for each item in the list view but every time I click the button the app crashes, I am getting a null object error. I want to know what I am doing wrong
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.streetsafe, PID: 15517
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.streetsafe.DatabaseHelper.deleteItem(int)' on a null object reference
at com.example.streetsafe.AdapterSearch.ListAdapterDelete$1.onClick(ListAdapterDelete.java:80)
at android.view.View.performClick(View.java:7448)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992)
at android.view.View.performClickInternal(View.java:7425)
at android.view.View.access$3600(View.java:810)
at android.view.View$PerformClick.run(View.java:28305)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
` Delete in database helper class
public void deleteItem(int getID) {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DELETE from crimes_table WHERE ID= '" +getID+ "'");
}
List adapter class
public class ListAdapterDelete extends ArrayAdapter<CrimesDelete> {
private Context context;
private List<CrimesDelete> crime;
ArrayAdapter<String> adapter;
DatabaseHelper DB_CRIME;
public ListAdapterDelete(Context context, List<CrimesDelete> crime){
super(context, R.layout.list_layout_delete, crime);
this.context = context;
this.crime = crime;
}
@NonNull
@Override
//Method generates the display for the list view
public View getView(int position, @Nullable View view, @NonNull ViewGroup parent) {
//ViewHolder describes the view of each text coming from the database
ViewHolder viewHolder;
if (view == null) {
viewHolder = new ViewHolder();
view = LayoutInflater.from(context).inflate(R.layout.list_layout_delete, null);
viewHolder.textDisplayId = view.findViewById(R.id.textDisplayId);
viewHolder.textDisplayLocationHeading = view.findViewById(R.id.textDisplayLocationHeading);
viewHolder.textDisplayLocation = view.findViewById(R.id.textDisplayLocation);
viewHolder.textDisplayTypeHeading = view.findViewById(R.id.textDisplayTypeHeading);
viewHolder.textDisplayTypeHeading = view.findViewById(R.id.textDisplayTypeHeading);
viewHolder.textDisplayType = view.findViewById(R.id.textDisplayType);
viewHolder.textDisplayDescriptionHeading = view.findViewById(R.id.textDisplayDescriptionHeading);
viewHolder.textDisplayDescription = view.findViewById(R.id.textDisplayDescription);
viewHolder.textDisplayDateHeading = view.findViewById(R.id.textDisplayDateHeading);
viewHolder.textDisplayDate = view.findViewById(R.id.textDisplayDate);
viewHolder.textDisplayTimeHeading = view.findViewById(R.id.textDisplayTimeHeading);
viewHolder.textDisplayTime = view.findViewById(R.id.textDisplayTime);
viewHolder.textDisplayRatingHeading = view.findViewById(R.id.textDisplayRatingHeading);
viewHolder.textDisplayRating = view.findViewById(R.id.textDisplayRating);
viewHolder.btnDisplayDelete = view.findViewById(R.id.btnDelete);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
//Gets the content from the crimes list and puts them into the text boxes
CrimesDelete crimes = crime.get(position);
viewHolder.textDisplayId.setText(String.valueOf(crimes.getID()));
viewHolder.textDisplayLocationHeading.setText("Location:");
viewHolder.textDisplayLocation.setText(crimes.getLOCATION() );
viewHolder.textDisplayTypeHeading.setText("Type of Crime:");
viewHolder.textDisplayType.setText(crimes.getTYPE());
viewHolder.textDisplayDescriptionHeading.setText("Description:");
viewHolder.textDisplayDescription.setText(crimes.getDESCRIPTION());
viewHolder.textDisplayDateHeading.setText("Date:");
viewHolder.textDisplayDate.setText(crimes.getDATE());
viewHolder.textDisplayTimeHeading.setText("Time:");
viewHolder.textDisplayTime.setText(crimes.getTIME());
viewHolder.textDisplayRatingHeading.setText("Danger Rating:");
viewHolder.textDisplayRating.setText(crimes.getRATING());
viewHolder.btnDisplayDelete.setText("Delete");
viewHolder.btnDisplayDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DB_CRIME.deleteItem(crimes.getID());
crime.remove(position);
notifyDataSetChanged();
}
});
return view;
}
private static class ViewHolder {
public TextView textDisplayId;
public TextView textDisplayLocationHeading;
public TextView textDisplayLocation;
public TextView textDisplayTypeHeading;
public TextView textDisplayType;
public TextView textDisplayDescriptionHeading;
public TextView textDisplayDescription;
public TextView textDisplayDateHeading;
public TextView textDisplayDate;
public TextView textDisplayTimeHeading;
public TextView textDisplayTime;
public TextView textDisplayRatingHeading;
public TextView textDisplayRating;
public TextView btnDisplayDelete;
}
}
As I see variable DB_CRIME is never initialized.