-2

I'm trying to do that after the user delete the item he wants the recyclerView is reLoading so everything looks good and there's not spaces between the items in the list. but i'm keep getting this error. would love your help. Every time the error is in the line of setAdapter , any idea's what can cause it?

public class mainScreen extends AppCompatActivity {
    Context context = mainScreen.this;
    ImageButton addButtonj;
    Intent intent;
    exercisesAdapter adapter;
    RecyclerView.Adapter mAdapter;
    ArrayList<Exercise> arrayList = new ArrayList();

    RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_screen);
        addButtonj = (ImageButton) findViewById(R.id.addButton);


        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        arrayList = DBCommands.getExercise(context);

         adapter = new exercisesAdapter(mainScreen.this, arrayList);
        recyclerView.setAdapter(adapter);

        addButtonj.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                intent = new Intent(mainScreen.this, addingExercise.class);
                startActivity(intent);
            }
        });


        ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                return false;
            }

            public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
                final int position = viewHolder.getAdapterPosition(); //get position which is swipe

                if (direction == ItemTouchHelper.LEFT) {    //if swipe left

                    AlertDialog.Builder builder = new AlertDialog.Builder(mainScreen.this); //alert for confirm to delete
                    builder.setMessage("Are you sure to delete?");    //set message

                    builder.setPositiveButton("REMOVE", new DialogInterface.OnClickListener() { //when click on DELETE
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            TextView theName = (TextView) viewHolder.itemView.findViewById(R.id.textView8);
                            String uID = theName.getText().toString();
//                            Toast.makeText(getApplicationContext(), "ID Value = " + uID + " Position = " + position, Toast.LENGTH_LONG).show();

                            DBCommands.deleteExercise(context, uID);
reload();
                        }
                    }).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {  //not removing items if cancel is done
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            mAdapter.notifyItemRemoved(position + 1);    //notifies the RecyclerView Adapter that data in mAdapter has been removed at a particular position.
                            mAdapter.notifyItemRangeChanged(position, mAdapter.getItemCount());   //notifies the RecyclerView Adapter that positions of element in mAdapter has been changed from position(removed element index to end of list), please update it.
                        }
                    }).show();  //show alert dialog

                }
            }


        };
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
        itemTouchHelper.attachToRecyclerView(recyclerView);
    }

    public void reload(){
        arrayList = DBCommands.getExercise(context);
         adapter=new exercisesAdapter(this,arrayList);
**recyclerView.setAdapter(adapter);**
adapter.notifyDataSetChanged();

    }
}

and The error:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference
    at com.enterprise.adirbenami.weight.mainScreen.reload(mainScreen.java:99)
    at com.enterprise.adirbenami.weight.mainScreen$2$2.onClick(mainScreen.java:78)
    at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:162)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6776)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
Adir
  • 3
  • 3

3 Answers3

1

You have created your RecyclerView instance globally in your activity

but inside your onCreate()you have gain craeted new instance RecyclerView

so that your recyclerView global is null

in java it is called Variable Shadowing

What Is Variable Shadowing?

  • Variable shadowing happens when we define a variable in a closure scope with a variable name that is the same as one for a variable we've already defined in an outer scope.
  • In other words, when a local variable has the same name as one of the instance variables, the local variable shadows the instance variable inside the method block.

Use this

     recyclerView = (RecyclerView) findViewById(R.id.recyclerView);

Instead of

    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);

Change in Your code

public class mainScreen extends AppCompatActivity {
    Context context = mainScreen.this;
    ImageButton addButtonj;
    Intent intent;
    exercisesAdapter adapter;
    RecyclerView.Adapter mAdapter;
    ArrayList<Exercise> arrayList = new ArrayList();

    RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_screen);
        addButtonj = (ImageButton) findViewById(R.id.addButton);


        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        arrayList = DBCommands.getExercise(context);

         adapter = new exercisesAdapter(mainScreen.this, arrayList);
        recyclerView.setAdapter(adapter);

        addButtonj.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                intent = new Intent(mainScreen.this, addingExercise.class);
                startActivity(intent);
            }
        });


        ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                return false;
            }

            public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
                final int position = viewHolder.getAdapterPosition(); //get position which is swipe

                if (direction == ItemTouchHelper.LEFT) {    //if swipe left

                    AlertDialog.Builder builder = new AlertDialog.Builder(mainScreen.this); //alert for confirm to delete
                    builder.setMessage("Are you sure to delete?");    //set message

                    builder.setPositiveButton("REMOVE", new DialogInterface.OnClickListener() { //when click on DELETE
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            TextView theName = (TextView) viewHolder.itemView.findViewById(R.id.textView8);
                            String uID = theName.getText().toString();
//                            Toast.makeText(getApplicationContext(), "ID Value = " + uID + " Position = " + position, Toast.LENGTH_LONG).show();

                            DBCommands.deleteExercise(context, uID);
reload();
                        }
                    }).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {  //not removing items if cancel is done
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            mAdapter.notifyItemRemoved(position + 1);    //notifies the RecyclerView Adapter that data in mAdapter has been removed at a particular position.
                            mAdapter.notifyItemRangeChanged(position, mAdapter.getItemCount());   //notifies the RecyclerView Adapter that positions of element in mAdapter has been changed from position(removed element index to end of list), please update it.
                        }
                    }).show();  //show alert dialog

                }
            }


        };
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
        itemTouchHelper.attachToRecyclerView(recyclerView);
    }

    public void reload(){
        arrayList = DBCommands.getExercise(context);
         adapter=new exercisesAdapter(this,arrayList);
**recyclerView.setAdapter(adapter);**
adapter.notifyDataSetChanged();

    }
}
AskNilesh
  • 67,701
  • 16
  • 123
  • 163
0

change your code to below code

 public class mainScreen extends AppCompatActivity {
Context context = mainScreen.this;
ImageButton addButtonj;
Intent intent;
exercisesAdapter adapter;
RecyclerView.Adapter mAdapter;
ArrayList<Exercise> arrayList = new ArrayList();

RecyclerView recyclerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_screen);
    addButtonj = (ImageButton) findViewById(R.id.addButton);


    recyclerView =  (RecyclerView)findViewById(R.id.recyclerView);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    arrayList = DBCommands.getExercise(context);

     adapter = new exercisesAdapter(mainScreen.this, arrayList);
    recyclerView.setAdapter(adapter);

    addButtonj.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            intent = new Intent(mainScreen.this, addingExercise.class);
            startActivity(intent);
        }
    });


    ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            return false;
        }

        public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
            final int position = viewHolder.getAdapterPosition(); //get position which is swipe

            if (direction == ItemTouchHelper.LEFT) {    //if swipe left

                AlertDialog.Builder builder = new AlertDialog.Builder(mainScreen.this); //alert for confirm to delete
                builder.setMessage("Are you sure to delete?");    //set message

                builder.setPositiveButton("REMOVE", new DialogInterface.OnClickListener() { //when click on DELETE
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        TextView theName = (TextView) viewHolder.itemView.findViewById(R.id.textView8);
                        String uID = theName.getText().toString();
                        Toast.makeText(getApplicationContext(), "ID Value = " + uID + " Position = " + position, Toast.LENGTH_LONG).show();

                        DBCommands.deleteExercise(context, uID);
reload();
                    }
                }).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {  //not removing items if cancel is done
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        mAdapter.notifyItemRemoved(position + 1);    //notifies the RecyclerView Adapter that data in mAdapter has been removed at a particular position.
                        mAdapter.notifyItemRangeChanged(position, mAdapter.getItemCount());   //notifies the RecyclerView Adapter that positions of element in mAdapter has been changed from position(removed element index to end of list), please update it.
                    }
                }).show();  //show alert dialog

            }
        }


    };
    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
    itemTouchHelper.attachToRecyclerView(recyclerView);
}

public void reload(){
    arrayList = DBCommands.getExercise(context);
     adapter=new exercisesAdapter(this,arrayList);
**recyclerView.setAdapter(adapter);**
adapter.notifyDataSetChanged();

}
 }

you were trying to initialize your recyclerview to new object in onCreate method that was creating the problem

Harsh Patel
  • 459
  • 3
  • 11
0

Please follow the Nilesh Rathod answer if it does not work. Go to your xml and check the id of recyclerView in your layout.

recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
Däñish Shärmà
  • 2,891
  • 2
  • 25
  • 43