我正在使用带有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
答案 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方法,但我会采用侦听器方法。