【问题标题】:How to highlight a ListView item using OnLongClickListener from custom Adapter class in Android如何使用 Android 中自定义适配器类的 OnLongClickListener 突出显示 ListView 项
【发布时间】:2013-02-06 12:49:28
【问题描述】:

这是我想做的:

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

这就是我所做的:

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

以下是不起作用的:

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

【问题讨论】:

    标签: android listview adapter highlight onlongclicklistener


    【解决方案1】:

    您可以在列表行布局的背景可绘制对象中设置 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

    【讨论】:

    • 试过了,但不幸的是这对我不起作用。问题是,我的 ListView 的行为不像 ListActivity 的默认 ListView,这意味着它甚至不会通过正常单击突出显示。我不知道如何改变它。
    【解决方案2】:

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

    代码相关步骤:

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

    2. 我在我的 Activity 中为我的 ListView 设置了一个 OnItemLongClickListener。从那里我触发 ActionMode 并像这样保存项目的 TextView 中的文本(itemNames 是设置为我的适配器的List&lt;String&gt;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 中(不要忘记在 ActionMode.CallbackonDestroyActionMode(ActionMode _mode) 中重绘或刷新 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:background="@drawable/my_selector",创建 selector.xml 就可以了。这样做对我有用。
    【解决方案3】:

    我遇到了这个问题,因为我遇到了同样的问题,即想在单击和长按时突出显示我的列表视图项。这对我有用。 Android Multi Choice Mode Listener with Custom Adapter

    【讨论】:

    • 你能添加一个链接的概要以防它消失吗?
    • 将 android:background="?android:activatedBackgroundIndicator" 添加到您的父 LinearLayout(每个列表的)以在选择时生成突出显示的背景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多