使用 ContextMenuInfo 的 null 值调用 onCreateContextMenu

发布于 2024-08-10 11:01:30 字数 730 浏览 9 评论 0原文

我正在尝试使用上下文菜单。我已经使用 SimpleCursorAdapter 成功地为一个简单的 ListActivity 完成了此操作。

继续,我想用 CursorAdapter 替换 SimpleCursorAdapter,但仍保留 ContextMenu 行为,因此我添加了两个强制覆盖函数 bindView 和 newView

public View newView(Context context, Cursor cursor, ViewGroup parent) {
    View view = mLayoutInflater.inflate(R.layout.check_row, parent, false);
    registerForContextMenu(view);
    return view;
}

请注意,registerForContextMenu 替换了 ListActivity 的 onCreate 方法中的 registerForContextMenu(getListView()) 。我发现有必要调用 onCreateContextMenu(...)

所有这些都有效(使用预期的小部件创建的行,它们的回调工作等),除了提供给 onCreateContextMenu(...) 的 ContextMenuInfo 参数现在为 null - 停止我无法访问 rowId。

是否还有另一个技巧可以执行 - 也许是在 CursorAdapter 的 bindView(...) 方法中?

I'm attempting to use a ContextMenu. I've successfully done this for a simple ListActivity using SimpleCursorAdapter.

Moving on I want to replace SimpleCursorAdapter with CursorAdapter but still retain the ContextMenu behaviour, so I've added the two mandatory override functions bindView and newView

public View newView(Context context, Cursor cursor, ViewGroup parent) {
    View view = mLayoutInflater.inflate(R.layout.check_row, parent, false);
    registerForContextMenu(view);
    return view;
}

Note the registerForContextMenu which replaces the registerForContextMenu(getListView()) in the onCreate method of the ListActivity. I found this necessary to get a call to onCreateContextMenu(...)

All this works (rows created with the expected widgets, callbacks on them working etc etc) except the ContextMenuInfo parameter supplied to onCreateContextMenu(...) is now null - stopping me from accessing the rowId.

Is there another trick to perform - perhaps in the bindView(...) method of the CursorAdapter?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我的影子我的梦 2024-08-17 11:01:30

我正在回答这个问题 - 但我想指出“commonsware.com”提供了线索和方向,见上文。

问题

  • 我认为,在行布局中使用 CheckBox 影响上下文菜单 CheckedTextView 的使用的
  • 是用于多重选择,它不适合初始化选中状态。

我采用的解决方案执行以下操作:

  1. 使用 CursorAdapter 中的 CheckedTextView
  2. Extend 来在 bindView(...) 期间初始化选中状态
    注意:这也必须管理显示正确的图标。
  3. 在 onListItemClick(...) 中管理 CheckedTextView 的状态并将其记录在 dBase 中,不要忘记更新光标。

I'm answering the question - but I would point out that 'commonsware.com' provided the clues and direction, see above.

The problem

  • Using CheckBox in the row layout impacts upon the use of Context menus
  • CheckedTextView is, I believe, intended for multi-selection, it doesn't lend itself to initialization of the checked state.

The solution I adopted does the following

  1. Use CheckedTextView
  2. Extend from CursorAdapter to initialize the checked state during bindView(...)
    Note: This must manage displaying the correct icons too
  3. Manage the CheckedTextView's state in onListItemClick(...) and record it in the dBase, not forgetting to update the cursor.
﹏雨一样淡蓝的深情 2024-08-17 11:01:30

这不是正确的做法。您为 ListView 注册上下文菜单,而不是行。预先调用 registerForContextMenu() ,也许在膨胀布局之后在 onCreate() 中调用。

That's not the right approach. You register the context menu for the ListView, not the rows. Call registerForContextMenu() up front, perhaps in onCreate() after you inflate the layout.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文