Search code examples
androidsqliteopenhelper

Adding data to recyclerview through SQlite


I am trying to show data one by one in recyclerview from database but application stop working with nullpoint Exception. Here is the detailed code because i am unable to find the mistake. i have tried with stringBuffer but it gets all the data and show all data in a single cardview.

GetterSetterClass.java

public class GetterAndSetterClass  {
private String name;
private String details;

public GetterAndSetterClass( String name, String details) {
    this.name = name;
    this.details = details;
}

public String getName() {
    return name;
}

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

public String getDetails() {
    return details;
}

public void setDetails(String details) {
    this.details = details;
}
}

cartAdapter.java(AdapterClass being used)

public class cartAdapter extends RecyclerView.Adapter<cartAdapter.cartVewHolder> 
 {

 private ArrayList<GetterAndSetterClass> namesLists;

public cartAdapter(ArrayList<GetterAndSetterClass> namesLists) {
    this.namesLists = namesLists;
}

@Override
public cartVewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.singletext,parent,false);
    cartVewHolder cartVewHolder=new cartVewHolder(view);
    return cartVewHolder;
}
@Override
public void onBindViewHolder(cartVewHolder holder, int position) {

   final GetterAndSetterClass getterAndSetterClass=namesLists.get(position);
   holder.textView.setText(getterAndSetterClass.getName());
    holder.textView2.setText(getterAndSetterClass.getDetails());
}
@Override
public int getItemCount() {
    return namesLists.size();
}

public class cartVewHolder extends RecyclerView.ViewHolder {
    TextView textView,textView2;
        public cartVewHolder(View itemView) {
        super(itemView);
        textView=itemView.findViewById(R.id.textviewCard);
        textView2=itemView.findViewById(R.id.textview2Card);

    }
}
}

cart.java(MainActivity being used)

DatabaseHelperClass databaseHelper;
RecyclerView recyclerView;
GetterAndSetterClass getterAndSetterClass;
cartAdapter cartAdapter;
ArrayList<GetterAndSetterClass> arrayList= new ArrayList<>();

onCreateMethod

recyclerView=findViewById(R.id.cart_recyclerview);
    databaseHelper=new DatabaseHelperClass(this);
    Cursor cursor=databaseHelper.getAllData();
    if (cursor!=null && cursor.getCount()>0){
        while (cursor.moveToNext()){
            getterAndSetterClass.setName(cursor.getString(1)+"\n");
            getterAndSetterClass.setDetails(cursor.getString(2)+"\n\n");
        }
         arrayList.add(getterAndSetterClass);
    }
    else {
        Toast.makeText(getApplicationContext(),"No Data to retrived",Toast.LENGTH_SHORT).show();
    }
    recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
    cartAdapter=new cartAdapter(arrayList);
    recyclerView.setAdapter(cartAdapter);

Error Log

E/AndroidRuntime: FATAL EXCEPTION: main
              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.uzairmughal.parcelable/com.example.uzairmughal.parcelable.Cart}: java.lang.NullPointerException
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2338)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
                  at android.app.ActivityThread.access$900(ActivityThread.java:148)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1319)
                  at android.os.Handler.dispatchMessage(Handler.java:99)
                  at android.os.Looper.loop(Looper.java:137)
                  at android.app.ActivityThread.main(ActivityThread.java:5494)
                  at java.lang.reflect.Method.invokeNative(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:525)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:875)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:691)
                  at dalvik.system.NativeStart.main(Native Method)
               Caused by: java.lang.NullPointerException
                  at com.example.uzairmughal.parcelable.Cart.onCreate(Cart.java:42)
                  at android.app.Activity.performCreate(Activity.java:5234)
                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2302)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388) 
                  at android.app.ActivityThread.access$900(ActivityThread.java:148) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1319) 
                  at android.os.Handler.dispatchMessage(Handler.java:99) 
                  at android.os.Looper.loop(Looper.java:137) 
                  at android.app.ActivityThread.main(ActivityThread.java:5494) 
                  at java.lang.reflect.Method.invokeNative(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:525) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:875) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:691) 
                  at dalvik.system.NativeStart.main(Native Method) 

Application terminated.


Solution

  • You need to handle the null case before calling size() method on your list namesLists.size()

    change your adapter getItemCount() with below code

    @Override
    public int getItemCount() {
      if(namesLists!=null)    
         return namesLists.size();
      else
        return 0;
    }
    

    You are not creating a object of GetterAndSetterClass and setting the values to getterAndSetterClass

    use this code

    while (cursor.moveToNext()){
       GetterAndSetterClass getterAndSetterClass = new GetterAndSetterClass(cursor.getString(1),cursor.getString(2));
       arrayList.add(getterAndSetterClass);
    }