Android ListView上是否有内置的“项目检查监听器”?

时间:2016-01-26 18:36:05

标签: android listview

我正在使用带有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)

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

从代码文档:

  

MultiChoiceModeListener接收{@link的事件   AbsListView#CHOICE_MODE_MULTIPLE_MODAL}。        它充当选择模式的{@link ActionMode.Callback}并且还接收        用户{@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)用于调出动作模式   (a.k.a.,上下文操作栏)使用操作栏时。你会看见   它在Gmail等应用中:当您开始检查列表中的项目时,   操作栏从通用活动级别操作更改为操作   要在列表上执行(例如,更改标签,垃圾)。

第三个选项是为列表项创建自定义视图/项并覆盖setChecked或setActivate方法,但我会采用侦听器方法。