1

I have an app which has had a ListView which is connected to a SQL database... Now I want to update the app to use the CardsUI https://github.com/nadavfima/cardsui-for-android

This code has been working fine until now:

public boolean onContextItemSelected(final MenuItem item) {
    switch (item.getItemId()) {
        case DONE_ID:
            AdapterContextMenuInfo infod = (AdapterContextMenuInfo) item
                    .getMenuInfo();
            long infodId = infod.id;
            Cursor items = dbAdapter.getMyItem(infodId);
            startManagingCursor(items);

            String title = items.getString(items
                    .getColumnIndexOrThrow(DbAdapter.KEY_TITLE));
            String description = items.getString(items
                    .getColumnIndexOrThrow(DbAdapter.KEY_DESCRIPTION));
            int priority = items.getInt(items
                    .getColumnIndexOrThrow(DbAdapter.KEY_PRIORITY));

            dbAdapter.updateList(infodId, priority, title,
                    description);
            return true;
        case EDIT_ID:
            AdapterContextMenuInfo idInfo = (AdapterContextMenuInfo) item
                    .getMenuInfo();
            long idInfolong = idInfo.id;
            Intent i = new Intent(this, Detail.class);
            i.putExtra(DbAdapter.KEY_ROWID, idInfolong);
            startActivityForResult(i, ACTIVITY_EDIT);
            return true;
    }
    return super.onContextItemSelected(item);
}

public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;

    menu.add(0, EDIT_ID, 0, R.string.menu_edit);
    menu.add(0, DONE_ID, 0, R.string.menu_done);
}

How can I use this code with the Cards? It always crashes. I read that if you manage a SQL cursor, it's connected to the MySQL. How can I get the ID of my record inside onContextItemSelected?

This is the my logcat output:

10-22 19:28:37.213: E/AndroidRuntime(3087): FATAL EXCEPTION: main
10-22 19:28:37.213: E/AndroidRuntime(3087): Process: com.myapp.mylist, PID: 3087
10-22 19:28:37.213: E/AndroidRuntime(3087): java.lang.NullPointerException
10-22 19:28:37.213: E/AndroidRuntime(3087):     at com.myapp.mylist.MainActivtiy.onContextItemSelected(MainActivity.java:395)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at android.app.Activity.onMenuItemSelected(Activity.java:2620)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:350)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at android.support.v7.app.ActionBarActivity.onMenuItemSelected(ActionBarActivity.java:155)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at com.android.internal.policy.impl.PhoneWindow$DialogMenuCallback.onMenuItemSelected(PhoneWindow.java:3864)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:741)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:884)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:167)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:941)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at android.widget.AdapterView.performItemClick(AdapterView.java:299)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2911)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at android.widget.AbsListView$3.run(AbsListView.java:3645)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at android.os.Handler.handleCallback(Handler.java:733)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at android.os.Handler.dispatchMessage(Handler.java:95)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at android.os.Looper.loop(Looper.java:136)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at android.app.ActivityThread.main(ActivityThread.java:5001)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at java.lang.reflect.Method.invokeNative(Native Method)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at java.lang.reflect.Method.invoke(Method.java:515)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
10-22 19:28:37.213: E/AndroidRuntime(3087):     at dalvik.system.NativeStart.main(Native Method)
user754730
  • 1,341
  • 5
  • 31
  • 62

1 Answers1

1

SQL _id for onContextItemSelected()

In onCreateContextMenu() Get the data of the item via the adapter. Then attach an itent to the menu item that contains the _id for the sql row. onContextItemSelected now has an intent attached to the menuitem that contains the sql row _id.

@Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {

        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
            String name = adapter2.getItem(info.position).get_name();
            menu.setHeaderTitle(name);
            MenuInflater inflater = this.getActivity().getMenuInflater();
            inflater.inflate(R.menu.menulistitem, menu);
            MenuItem mi = menu.findItem(R.id.action_context_delete);
            Intent i = new Intent();
            //put the database _id into the intent for the oncontextitemselected
            i.putExtra("id", adapter2.getItem(info.position).get_id());
            mi.setIntent(i);

    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {

        switch (item.getItemId()) {
        case R.id.action_context_delete:
            Intent i = item.getIntent();
            if (i != null) {
                Bundle b = i.getExtras();
                if (b != null) {
                    int id = b.getInt("id");
                    Uri deleteIdUri = ContentUris.withAppendedId(
                            RidesDatabaseProvider.CONTENT_URI, id);
                    context.getContentResolver()
                            .delete(deleteIdUri, null, null);
                    return true;
                }
            }
        }
        return super.onContextItemSelected(item);
    }
danny117
  • 5,581
  • 1
  • 26
  • 35
  • had same problem and I solved it by passing _id in menuitem intent – danny117 Oct 22 '14 at 20:01
  • Can you have a look at my code maybe? I don't know exactly how this would work on my code... – user754730 Oct 22 '14 at 21:06
  • See how I use info.postion on getItem of the adapter for the list. You need to at least save info.postion into an intent and then attach that intent to the menuitem. Then in your oncontextitemselected you actually know what item was selected by the value stored in the intent. – danny117 Oct 23 '14 at 13:25