【问题标题】:Get ID inside onContextItemSelected with CardsUI使用 CardsUI 在 onContextItemSelected 中获取 ID
【发布时间】:2014-09-01 18:07:25
【问题描述】:

我有一个应用程序,它有一个连接到 SQL 数据库的ListView... 现在我想更新应用以使用 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)

【问题讨论】:

  • 对不起,我更新了我的答案
  • 你能粘贴你的 MainActivity 代码吗?至少你的 onContextItemSelected 代码
  • 是的,对不起,我发布了我的代码...

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


【解决方案1】:

onContextItemSelected() 的 SQL _id

onCreateContextMenu()通过适配器获取item的数据。然后将一个item 附加到包含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);
    }

【讨论】:

  • 有同样的问题,我通过在 menuitem 意图中传递 _id 解决了它
  • 你能看看我的代码吗?我不知道这将如何在我的代码上工作......
  • 看看我如何在适配器的 getItem 上使用 info.postion 来获取列表。您至少需要将 info.postion 保存到一个意图中,然后将该意图附加到菜单项。然后在您的 oncontextitemselected 中,您实际上知道存储在意图中的值选择了哪个项目。
猜你喜欢
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 2016-10-19
相关资源
最近更新 更多