1

这是我想要做的:

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

这是我所做的:

我遵循了自定义适配器的教程和动作模式的教程。两者都工作正常。我能够与我的适配器和 ListView 底层的数据库进行交互。我应该提到,我在自定义适配器类中实现了 ActionMode 的所有内容。

这是不起作用的:

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

4

3 回答 3

3

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

代码相关步骤:

  1. 我将所有与 ActionMode 相关的代码从我的适配器类移到了我的活动类。在此之前,我通过在 ListView 项目中的 TextView 上使用 OnLongClickListener 触发了操作模式,因为那时我不知道如何使 TextView 的文本可用于 ActionMode(我希望能够通过单击图标将其删除在操作栏中)。当您在其中一个 ListView 项目上使用 CLickListener 时,它有点“阻止”您在 Activity 中设置的 ListView 项目的 OnClickListener。不要那样做!!!

  2. 我在我的活动中为我的 ListView 设置了一个 OnItemLongClickListener。从那里我触发 ActionMode 并像这样从项目的 TextView 保存文本(itemNamesList<String>我的适配器的集合,deleteString是我的 Activity 的类属性):

    deleteString = itemNames.get(_postion);

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

XML相关步骤:

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

通过这种方式,我实现了以下目标:

  • 我的 Activity 中有一个带有自定义布局(TextView + CheckBox)和自定义适配器的 ListView
  • 我可以在 CheckBox 上使用 OnCheckedChangeListener
  • 我可以通过长按我的 ListView 项目来激活 ActionMode 并到达 TextView 的内容以进行进一步处理
  • 当我单击它时,我在我的 ListView 项目上获得了默认的 holo_blue_light 背景突出显示(我在我的应用程序中使用带有深色操作栏的 Holo 主题灯)

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

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

在我的 Activity 类中我的 ListView 的 OnItemLongClickListener 中(不要忘记重绘或刷新你的onDestroyActionMode(ActionMode _mode)ListView ActionMode.Callback

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

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

<?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>

我的选择器:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true">
        <layer-list>
            <item>
                <shape android:shape="rectangle">
                    <solid android:color="@android:color/holo_blue_light" />
                </shape>
            </item>
        </layer-list>
    </item>
    <item>
        <color android:color="#00000000" />
    </item>

</selector>
于 2013-02-26T09:28:42.097 回答
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 > Api 11

于 2013-02-21T09:10:49.653 回答
0

我遇到了这个问题,因为我遇到了同样的问题,即想在单击和长按时突出显示我的列表视图项目。这对我有用。 带有自定义适配器的 Android 多选模式侦听器

于 2013-10-08T13:37:44.713 回答