使用CardsUI在onContextItemSelected中获取ID

时间:2014-09-01 18:07:26

标签: android android-listview android-sqlite android-cards

我有一个应用程序,其ListView连接到SQL数据库... 现在我想更新应用程序以使用CardsUI https://github.com/nadavfima/cardsui-for-android

此代码一直运作良好,直到现在:

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);
}

如何在卡上使用此代码?它总是崩溃。我读到如果你管理一个SQL游标,它就连接到了MySQL。如何在onContextItemSelected内获取记录的ID?

这是我的logcat输出:

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)

1 个答案:

答案 0 :(得分:1)

用于onContextItemSelected()的SQL _id

onCreateContextMenu()中通过适配器获取项目的数据。然后将一个itent附加到包含sql行的_id的菜单项。 onContextItemSelected现在有一个附加到包含sql行_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);
    }