我在平板电脑屏幕的左侧导航中使用 ExpandableListView。
当用户按下可展开列表中某个组的子项时,我希望让子项保持按下状态,以便用户知道正在为哪个子项显示右手内容。
对于 ListView,我可以通过代码中的这一行来实现这个效果:
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
然后应用这个选择器:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true" android:drawable="@drawable/menu_item_pressed" />
<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/menu_item_normal" />
<item android:state_pressed="true" android:drawable="@drawable/menu_item_pressed" />
<item android:state_focused="true" android:state_pressed="false" android:drawable="@drawable/menu_item_pressed" />
listView 项被按下后,listView 项上的“state_activiated”为真。
我希望同样的技术适用于我的 expandableListView,但它没有。我用过:
getExpandableListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
然后使用上面相同的选择器,但它不起作用。我还尝试了其他状态,例如 state_selected 和 state_checked,但它们也不起作用。
上面的选择器正确地应用了按下和未按下状态。然而,看起来使用 ExpandableListView,按下 child 后状态不会“激活”。
感谢任何帮助。谢谢!
最佳答案
在 ExpandableListView 上执行以下操作:
步骤 1. 将选择模式设置为单一(可以在 xml 中作为 android:choiceMode = "singleChoice" 完成)
第 2 步。 使用选择器 xml 作为背景 (android:listSelector = "@drawable/selector_list_item")
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:exitFadeDuration="@android:integer/config_mediumAnimTime">
<item android:drawable="@android:color/holo_blue_bright" android:state_pressed="true"/>
<item android:drawable="@android:color/holo_blue_light" android:state_selected="true"/>
<item android:drawable="@android:color/holo_blue_dark" android:state_activated="true"/>
</selector>
第 3 步。 在 onChildClick() 回调中调用 expandableListView.setItemChecked(index,true)。
index是从0开始计算的子item的索引
第 1 组 [索引 = 0]
- 子项 1
- 子项目 2
- 子项 3 [索引 = 3]
第 2 组 [索引 = 4]
- 子项 1
- 子项目 2
- 子项目 3 [索引 = 7]
第 3 组 [索引 = 8]
- 子项 1
- 子项目 2
- 子项 3 [索引 = 11]
如果我们也有列表标题,它们也将说明索引值。
这是一个工作示例:
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
...
int index = parent.getFlatListPosition(ExpandableListView.getPackedPositionForChild(groupPosition, childPosition));
parent.setItemChecked(index, true);
return true;
}
关于android - ExpandableListView - 将选定的子项保持在 "pressed"状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8315855/