如何使用Android中的自定义Adapter类使用OnLongClickListener突出显示ListView项

时间:2013-02-21 08:58:21

标签: android listview adapter highlight onlongclicklistener

这就是我想要做的事情:

在我的主Activity中,我有一个带有自定义适配器的ListView,因为我的ListView项应包含TextView和CheckBox。当我长按一个项目时,我想在ActionBar中使用上下文动作模式并突出显示所选的ListView项目。

这就是我的所作所为:

我为自定义适配器执行了此Tutorial,为ActionMode执行了此Tutorial。两者都很好。我能够与我的适配器和ListView底层的数据库进行交互。我应该提一下,我在自定义适配器类中实现了ActionMode的所有内容。

这是什么不起作用:

虽然我能够删除与ListView项目中TextView内容相对应的数据库条目,但我无法弄清楚如何突出显示所选的ListView项目。

3 个答案:

答案 0 :(得分:3)

我终于设法找到了解决方案。我采取了几个不同的步骤:

与代码相关的步骤:

  1. 我将所有与ActionMode相关的代码从我的适配器类移到了我的activity类。在此之前,我通过在ListView项目中的TextView上使用OnLongClickListener来触发操作模式,因为此时我不知道如何为ActionMode提供TextView的文本(我希望能够通过单击图标来删除它)在ActionBar中)。当您在其中一个ListView项目上使用CLickListener时,它会“阻止”您在Activity中设置的ListView项的OnClickListener。不要那样做!!!
  2. 我在我的Activity中为我的ListView设置了一个OnItemLongClickListener。从那里我触发ActionMode并保存项目TextView中的文本(itemNamesList<String>设置到我的适配器,deleteString是我的Activity的类属性):

    deleteString = itemNames.get(_postion);

  3. 但是这些步骤只是为了让我的代码正常工作,因为我必须通过XML进行更改。

    与XML相关的步骤:

    1. 我必须从ListView项目主要布局
    2. 中删除background属性
    3. 我必须在外部行布局中添加以下属性:android:clickable="true"android:longClickable="true"(也许longClickable已经足够了,只是为了确定;-))
    4. 我必须创建一个自己的选择器drawable并将其设置为我的ListView项目布局的背景:android:background="@drawable/my_selector"
    5. 这样我实现了以下目标:

      • 我的Activity中有一个ListView,带有自定义布局(TextView + CheckBox)和自定义适配器
      • 我可以在CheckBox上使用OnCheckedChangeListener
      • 我可以通过长按我的ListView项目来激活ActionMode并获取TextView的内容以进行进一步的处理
      • 当我点击它时,我的ListView项目上的默认holo_blue_light背景突出显示(我使用Holo Theme Light和Dark Action Bar为我的应用程序)

      我唯一没有通过XML工作的是在ActionMode处于活动状态时保持我的ListView项目突出显示,所以我这样做了

      _view.setBackgroundResource(android.R.color.holo_blue_dark);
      

      在我的Activity类的ListView的OnItemLongClickListener中(不要忘记在onDestroyActionMode(ActionMode _mode)的{​​{1}}中重绘或刷新ListView

      瞧!我希望这对你们中的一些人有所帮助!我花了几天时间和很多研究。

      这里是我的ListView项目布局和我的选择器布局的代码示例:

      ActionMode.Callback

      我的选择器:

      <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:background="@drawable/my_selector"
          android:clickable="true"
          android:longClickable="true" >
      
          <CheckBox
              android:id="@+id/checkBox"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignParentRight="true"
              android:layout_centerVertical="true"
              android:layout_marginRight="6dp" >
          </CheckBox>
      
          <TextView
              android:id="@+id/shoppingListItemName"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignParentLeft="true"
              android:layout_marginLeft="10dp"
              android:layout_toLeftOf="@id/checkBox"
              android:gravity="center_vertical"
              android:minHeight="?android:attr/listPreferredItemHeightSmall"
              android:textAppearance="?android:attr/textAppearanceListItemSmall"
              android:textIsSelectable="true" >
          </TextView>
      
      </RelativeLayout>
      

答案 1 :(得分:0)

您可以在列表行布局的背景可绘制中设置android:state_activated = true

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_activated="true">
    <layer-list >
        <!-- <item >
            <color android:color="#ff00aa00"/>
        </item> -->

        <item>
            <shape android:shape="rectangle">
                <solid android:color="#aa58BAED"/>
                <corners android:radius="3px"/>
            </shape>
        </item>
    </layer-list>
</item>
<item >
    <color android:color="#00000000"/>
</item>
</selector>

但它只适用于android api&gt; Api 11

答案 2 :(得分:0)

我遇到了这个问题,因为我遇到了同样的问题,即想点击并长按一下我的列表视图项目。这适合我。 Android Multi Choice Mode Listener with Custom Adapter