【问题标题】:Is there any built-in "item checked listener" on Android ListView?Android ListView 上是否有任何内置的“项目检查侦听器”?
【发布时间】:2016-01-26 18:36:04
【问题描述】:

我正在使用带有 CHOICE_MODE_MULTIPLE 的 ListView 和一个显示图像列表的 ArrayAdapter。当我单击列表元素时,它会被选中并且图像会发生变化。一切正常。

图片选择器:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:drawable="@drawable/check"/>
    <item android:drawable="@drawable/uncheck"/>
</selector>

ListView 有几种检查项目的方法(我都使用它们),例如:getCheckedItemPositions()、getCheckedItemCount() 和setItemChecked(int position, boolean value)。

但是,它不包含为检查项设置侦听器的任何方法,例如:setOnItemCheckedListener(setOnItemSelectedListener 不适用于检查)。

我使用OnClickListener 实现了我想要的,但这不是理想的方式(例如,当我使用setItemChecked 时它不会被调用)。有没有更好的解决方案?

信息:Android SDK:23。测试设备:Android 5.0

【问题讨论】:

    标签: android listview


    【解决方案1】:

    您为什么不创建一个充当 OnItemSelectedListener 的方法(对选中的项目做任何您想做的事情)并从 OnClickListener 和 setItemChecked(覆盖)调用它?

    正如我在 cmets 中所说,唯一可以设置的侦听器是 setMultiChoiceModeListener(),仅当您将 listView 的选择模式设置为 CHOICE_MODE_MULTIPLE_MODAL 时才会调用它。这是从 setItemChecked() 等方法触发的唯一侦听器。

    来自代码文档:

    MultiChoiceModeListener 接收 {@link 的事件 AbsListView#CHOICE_MODE_MULTIPLE_MODAL}。 It acts as the {@link ActionMode.Callback} for the selection mode and also receives {@link #onItemCheckedStateChanged(ActionMode, int, long, boolean)} 用户时的事件 选择和取消选择列表项。

    您可以使用调用的 doSomething() 方法更改 checkedState 方法或将选择模式更改为 CHOICE_MODE_MULTIPLE_MODAL 并像这样实现 setMultiChoiceModeListener():

    listview.setMultiChoiceModeListener(
        new MultiChoiceModeListener(){
            @Override
            public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
                //DO SOMETHING
    
            }
        }
    );
    

    这个答案很好地解释了 CHOICE_MODE_MULTIPLE_MODAL:https://stackoverflow.com/a/12713241/5837758(还有一个 MultiChoiceModeListener 的例子)

    这个 (CHOICE_MODE_MULTIPLE_MODAL) 用于调出动作模式 (又名,上下文操作栏)使用操作栏时。你会看见 它在 Gmail 等应用程序中:当您开始检查列表中的项目时, 操作栏从通用活动级别操作更改为操作 要在列表上执行(例如,更改标签、回收站)。

    第三种选择是为您的列表项创建自定义视图/项目并覆盖 setChecked 或 setActivate 方法,但我将使用侦听器方法。

    【讨论】:

    • 你也可以检查 setMultiChoiceModeListener() 方法
    • 在您的答案中添加其他信息,即编辑您的答案!
    • 我知道我可以做到这一点(这几乎就是我实际所做的),但这并不能阻止我可能忘记的任何其他情况(检查列表中项目的其他方法)。我只是想知道是否有任何 BUILT-IN 方法,因为它似乎应该是 Android SDK。
    • 我编辑了我的答案,抱歉,我当时没有足够的代表。希望它有所帮助:)
    • 啊,非常感谢!!这正是我想要的!我不知道这个多项选择模式是什么,我只是在使用多项选择。我也改变了动作栏,这样就容易多了!这帮助超出了我的预期。
    猜你喜欢
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2012-02-22
    • 1970-01-01
    相关资源
    最近更新 更多