android - 如何使用 Android 中自定义适配器类的 OnLongClickListener 突出显示 ListView 项目

标签 android listview adapter highlight onlongclicklistener

这是我想做的:

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

这是我做的:

我关注了这个Tutorial对于自定义适配器和这个 Tutorial对于 Action 模式。两者都工作正常。我能够与我的适配器和 ListView 下的数据库进行交互。我应该提到,我在我的自定义适配器类中实现了 ActionMode 的所有内容。

这是不起作用的:

虽然我能够删除与 ListView 项目中的 TextView 内容对应的数据库条目,但我不知道如何突出显示所选的 ListView 项目。

最佳答案

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

代码相关步骤:

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

  2. 我在我的 Activity 中为我的 ListView 设置了一个 OnItemLongClickListener。从那里我触发 ActionMode 并像这样从项目的 TextView 中保存文本(itemNames 是一个 List<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 项目时,我在我的 ListView 项目上获得了默认的 holo_blue_light 背景突出显示(我为我的应用程序使用了 Holo Theme Light 和 Dark Action Bar)

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

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

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

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

这里是我的 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>

关于android - 如何使用 Android 中自定义适配器类的 OnLongClickListener 突出显示 ListView 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14998149/

相关文章:

orm - 轨道 3 : DataMapper instead of ActiveRecord

c++ - 使用适配器设计模式

java - Android Java动态按钮点击

android - 具有工作选择、光标位置等的自定义旋转 EditText View

android - 使用安卓模拟器给自己打电话

android - 在android中恢复listView

java - ListView OnItemClickListener 不适用于 LazyAdapter ListView

android - 抽屉导航 - 可扩展 ListView 的 ImageView 问题

java - 发现类型不匹配 : Required: Context,:Intent

android - 用于 NFC 设备身份验证的 AES 与 3DES (Mifare)