-2

I tried few of solved problems on this site about this instance of problems, but, seems like mine is specific, because it doesn't shows for instance of uninitialized object but on method that isn't even called.

error log

java.lang.NullPointerException: Attempt to invoke virtual method 'void rs.ridjis.glosar.rjecnik.RjecnikCursorAdapter.changeCursor(android.database.Cursor)' on a null object reference
    at rs.ridjis.glosar.activities.MainActivity.changeCursor(MainActivity.java:75)
    at rs.ridjis.glosar.activities.MainActivity.onOptionsItemSelected(MainActivity.java:114)
    at android.app.Activity.onMenuItemSelected(Activity.java:2885)
    at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:361)
    at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:147)
    at android.support.v7.internal.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:100)
    at android.support.v7.internal.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:100)
    at android.support.v7.internal.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:73)
    at android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.java:180)
    at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:761)
    at android.support.v7.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811)
    at android.support.v7.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:153)
    at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958)
    at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:948)
    at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:619)
    at android.support.v7.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:139)
    at android.view.View.performClick(View.java:4789)
    at android.view.View$PerformClick.run(View.java:19881)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5294)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

MainActivity.java

public class MainActivity extends AppCompatActivity implements Communicator {
public Toolbar toolbar;
private RjecnikCursorAdapter adapter;
private FragmentManager fragmentManager;
private WordsListFragment wordsListFragment;

private RjecnikDB dbRjecnik;
private SQLiteDatabase db;
private Cursor cursor;
private final String QUERY_SELECTALL = "SELECT * FROM " + RjecnikDB.TABLE;

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

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    fragmentManager = getFragmentManager();

    wordsListFragment = new WordsListFragment();

    final FragmentTransaction ft = fragmentManager.beginTransaction();
    ft.add(R.id.fragment_container, wordsListFragment);
    ft.commit();
}

///// Implementation interface methods /////
public void changeCursor() {
    db = dbRjecnik.getWritableDatabase();
    cursor = db.rawQuery(QUERY_SELECTALL, null);
    adapter.changeCursor(cursor);
    db.close();
    Toast.makeText(this, "Lista ažurirana", Toast.LENGTH_SHORT).show();
}

public Cursor initCursor() {
    dbRjecnik = RjecnikDB.getInstance(getApplicationContext());
    db = dbRjecnik.getWritableDatabase();
    cursor = db.rawQuery(QUERY_SELECTALL, null);
    return cursor;
}

public void deleteOnLongClick(int id) {
    db = dbRjecnik.getWritableDatabase();
    db.delete(RjecnikDB.TABLE, RjecnikDB.COLUMN_ID + " = ?", new String[] { Integer.toString(id) } );
    db.close();
}
// END OF IMPLEMENTATION //

@Override
protected void onRestart() {
    super.onRestart();
    changeCursor();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.search_bar) {
        return true;
    } else if (id == R.id.refresh) {
        changeCursor();
    }

    return super.onOptionsItemSelected(item);
}

As you can see from error log, problem is where shows changeCursor(), even if it's not called, onOptionItemSelected. What is best way to fix this? It's neither working when I call cursor = initCursor() before actionBar initialization.

rolve
  • 10,083
  • 4
  • 55
  • 75
ridjis
  • 55
  • 10
  • I already read that topic, and it haven't solved my problem. – ridjis Feb 17 '16 at 19:17
  • *on method that isn't even called* -- uhh, yeah, `RjecnikCursorAdapter.changeCursor` **is** called... Line 75 of MainActivity `adapter.changeCursor(cursor)` – OneCricketeer Feb 17 '16 at 19:17
  • @cricket_007 Adapter class has it's own method changeCursor, with just call of superclass's changeCursor(). `@Override public void changeCursor(Cursor cursor) { super.changeCursor(cursor);}` – ridjis Feb 17 '16 at 19:39
  • Sure, but `adapter == null`, and that is your error. – OneCricketeer Feb 17 '16 at 19:40
  • @cricket_007 yes, but again I'm getting errors `Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase rs.ridjis.glosar.rjecnik.RjecnikDB.getWritableDatabase()' on a null object reference` – ridjis Feb 17 '16 at 19:43
  • Initialize all your variables!! `dbRjecnik == null` on that error – OneCricketeer Feb 17 '16 at 19:43
  • At the beggining of onCreate method I called initCursor() which instantiated dbRjecnik object. – ridjis Feb 17 '16 at 19:45

1 Answers1

0

You never initialize adapter before you use it. That's why it is null and you get a NullPointerException when you call

adapter.changeCursor(cursor);
Jens
  • 67,715
  • 15
  • 98
  • 113
  • Thank you, beside I'm beginner in android programming, I'm trying to convert app made with activities to fragments, and I found it difficult so I event can't see trivial errors like this one. – ridjis Feb 17 '16 at 19:17