【问题标题】:ContextMenu will not appear on ListView when using SimpleCursorAdapter使用 SimpleCursorAdapter 时,ContextMenu 不会出现在 ListView 上
【发布时间】:2011-10-10 14:03:28
【问题描述】:

我是 android 开发的新手,我正在开发适用于运行 Android 3.1 的平板电脑的应用程序。 主要活动分为更多功能部分,其中一个显示一些项目的列表,长按项目应打开上下文菜单。 我有一个问题,因为我无法让它工作。

主要活动扩展了 MapActivity,因为它还包含地图... ListView 使用 SimpleCursorAdapter

在主Activity的onCreate方法中为上下文菜单注册了列表视图:

  alarmList = (ListView) findViewById (R.id.alarmList);
  registerForContextMenu(alarmList);

主要活动覆盖 onCreateContextMenuonContextItemSelected 方法,但在单击项目时永远不会调用它。


我想知道在使用 ArrayAdapter 和项目的简单字符串显示时,列表的上下文菜单运行良好,并且列表在单击时提供了很好的项目选择(带有一些很好的淡入淡出-出效果)。但是当我将适配器更改为 SimpleCursorAdapter 时,列表视图根本不会对点击做出反应。为了“模拟”点击,我向 ListView 添加了 clickable 属性:

<ListView android:id="@+id/alarmList" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true"/>

单个列表项使用其自己的布局进行格式化,如下所示: [alarm_list_item.xml:]

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearLayout" android:layout_width="match_parent" android:background="@color/alarm_list_bg"
    android:clickable="true" android:baselineAligned="true" android:layout_height="wrap_content" android:minHeight="65dp">
...

[alarm_list_bg:]

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="false" android:state_pressed="false" android:drawable="@color/black_12"/>
<item android:state_pressed="true"  android:drawable="@color/grey_12" />
<item android:state_selected="true" android:state_pressed="false" android:drawable="@color/blue_12" />
</selector>

我尝试直接在 ListView 实例上注册一些监听器(OnItemLongClickListenerOnCreateContextMenuListenerOnItemClickListener) ,但没有一个被调用。

您能知道可能出了什么问题吗?

亲切的问候 米雷克

【问题讨论】:

  • 这里是一个示例项目,展示了使用带有 SimpleCursorAdapter 的上下文菜单:github.com/commonsguy/cw-android/tree/master/Database/Constants
  • 感谢您的 cmets。我找到了问题,它是由两件事引起的:1.项目视图中的复选框,2.可点击属性。如何将复选框放在项目视图中,因为它不会“窃取”整个项目的焦点?我已暂时将操作移至上下文菜单,但我想将其直接放在列表行中...
  • 我不完全确定你的意思。这是一个示例项目,显示使用带有 CHOICE_MODE_MULTIPLE ListView 的上下文菜单:github.com/commonsguy/cw-advandroid/tree/master/Honeycomb/… 请注意,这也显示了 Honeycomb 的操作模式的使用,因此这个示例可能比您需要的更详细.
  • 感谢您的示例,它们非常有帮助。但是再一次:如果列表视图项包含一个复选框(或图像按钮,评分栏,...),则在单击列表项时不会出现注册的上下文菜单。同样的问题在您的示例RateListViewDemo中-如果我注册了一个上下文菜单对于列表视图,菜单不会出现,因为 ratingBar “窃取”了点击事件。我可以解决这个问题的唯一方法是使用 ImageView 而不是复选框或按钮,并在其 onClick 事件上注册一些侦听器方法。但我不喜欢这样,因为它不会呈现点击效果..

标签: android listview contextmenu simplecursoradapter


【解决方案1】:

尝试从类似的东西开始

    alarmList.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
                    public void onCreateContextMenu(ContextMenu menu, View v,
                                    ContextMenuInfo menuInfo) {
                            menu.add(0, ENTRY_ADD, 1, "Add");
                            menu.add(0, ENTRY_REMOVE , 2,"Remove");
                    }}); 

如果它不起作用,请从 XML 中删除所有不必要的属性,例如 android:clickable - 使用最小的工作示例,然后找出导致问题的原因。

【讨论】:

    【解决方案2】:

    尝试将此属性添加到复选框:

    focusable="false"
    

    【讨论】:

      【解决方案3】:
      mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
              @Override
              public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                  return false;
              }
          });
      

      记得在函数'onItemLongClick'结束时返回false。如果返回true,系统会认为函数'onItemLongClick'“吃掉”长按事件。

      【讨论】:

        【解决方案4】:

        在您将 setClickable(true) 方法设置为 true 之前,ListView 不会处理长点击

        listviewobject.setClickable(true)

        【讨论】:

          【解决方案5】:

          一个迟到的答案,但它可能会帮助别人。 在我的情况下,上下文菜单没有显示,因为我的列表适配器有稳定的 id。

          删除以下块解决了这个问题:

          @Override
          public boolean hasStableIds() {
              return true;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-19
            • 1970-01-01
            相关资源
            最近更新 更多