java-ExpandableListView打开折叠问题

提问

我正在使用自定义可扩展列表适配器.当用户单击它时,我突出显示一个孩子.在用户打开/折叠组之前,此方法工作正常.假设用户触摸第2组项目1.这将突出显示第2组项目1.然后,用户打开第1组.现在,第3组项目2被突出显示.我已经进行了一些测试,选择了不同的项目,但是找不到突出显示的行将跳转到的模式.有时它在列表中上升,有时它在下降中.我在弄清楚放入活动的onGroupExpandListener和onGroupCollapseListener来重新显示正确视图的逻辑时遇到了麻烦.有任何想法吗?

编辑:我的onChildClickListener内部的当前代码

if (groupPosition == 0){ 
      switch(childPosition) {
      case 0: 
        previouslySelectedView.setBackgroundResource(R.color.transparent);
        currentlySelectedView.setBackgroundResource(R.color.blue); 
        break;

所有组/儿童使用相同的代码

最佳答案

ExpandableListView中的项目选择是通过平面列表(绝对位置)进行的.因此,如果新打开的组在选择curnet之前,并且子节点较少,则选择将向上移动,反之亦然.我建议将选择模式设置为无,并实现onclick / expand逻辑来处理您自己的焦点-例如,为视图实现标签,并通过该标签设置当前突出显示的项目.

以下是一些建议:

>首先,在ExpandableListView.OnChildClickListener中执行ExpandableListView.findViewWithTag(theTag),以检查带有此类标记的视图并取消标记它们(也为setTag(null))并恢复背景.然后为该项目单击setTag(theTag),并将背景更改为选定.当然,您可以具有其他逻辑并标记多个项目.请注意,一旦视图被破坏,您将丢失选择(例如,在展开期间).
>拥有一些自定义地图或其他东西,它们将拥有视图的唯一ID和(未标记)状态.那是最好的解决方案,它将允许在滚动和扩展之间保持持久选择.
>在备用适配器中引入“已标记”状态.因此,即使在应用程序启动/停止之间,标记也将保持不变.但是,这不是一个好方法,因为选择更多是一种UI行为.

我目前正在使用列表的“选择模式倍数”进行ExpandableListView选择.但是,正如我所说的那样,选择是在功能方面我必须牺牲的每个位置,也就是说,每当进行操作时,我都会清除选择.以前的实现是使用自定义Map来保存选定的ID,老实说,这是更好的方法.

这是我获取选定ID的方式(请记住我多次使用选择模式):

final SparseBooleanArray checkedPositions = expList.getCheckedItemPositions();
final ExpandableListAdapter adapter = expList.getExpandableListAdapter();
List<Long> checkedIds = new ArrayList<Long>();
if (packedPositionType == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
    for (int i = checkedPositions.size() - 1; i >= 0; i--) {
        if (checkedPositions.valueAt(i)) {
            checkedIds.add(adapter.getGroupId(checkedPositions.keyAt(i)));
        }
    }
}

但是,就您而言,您将需要检查是否有儿童打包的职位.另请注意,我的适配器具有稳定的(唯一)ID.如果您没有稳定的ID,则可以依赖ExpandableListView的getPackedPositionForChild()方法并按标记存储打包位置.