代码之家  ›  专栏  ›  技术社区  ›  kostmo

ChoiceMode是否与ExpandableListView兼容?

  •  9
  • kostmo  · 技术社区  · 14 年前

    有没有可能用 android:choiceMode="multipleChoice" setChoiceMode(ListView.CHOICE_MODE_MULTIPLE) 关于一个 ExpandableListView ?我可以用 CheckBox 平原上的ES ListView 但是它似乎不适合 多级列表 . 在后者中,单击列表项(父项或子项)不会像在前者中那样影响复选框。

    我注意到可以点击复选框进行切换,但这是一个非常小的目标。

    这里是一个 relevant unanswered forum post .

    2 回复  |  直到 10 年前
        1
  •  9
  •   jiahao    11 年前

    默认情况下不是。检查源代码,可以看到以下内容:

    512     @Override
    513     public boolean performItemClick(View v, int position, long id) {
    514         // Ignore clicks in header/footers
    515         if (isHeaderOrFooterPosition(position)) {
    516             // Clicked on a header/footer, so ignore pass it on to super
    517             return super.performItemClick(v, position, id);
    518         }
    519         
    520         // Internally handle the item click
    521         final int adjustedPosition = getFlatPositionForConnector(position);
    522         return handleItemClick(v, adjustedPosition, id);
    523     }
    
    533         boolean handleItemClick(View v, int position, long id) {
    534         final PositionMetadata posMetadata = mConnector.getUnflattenedPos(position);
    535         
    536         id = getChildOrGroupId(posMetadata.position);
    537         
    538         boolean returnValue;
    539         if (posMetadata.position.type == ExpandableListPosition.GROUP) {
    540             /* It's a group, so handle collapsing/expanding */
                    ...
    579         } else {
    580             /* It's a child, so pass on event */
    581             if (mOnChildClickListener != null) {
    582                 playSoundEffect(SoundEffectConstants.CLICK);
    583                 return mOnChildClickListener.onChildClick(this, v, posMetadata.position.groupPos,
    584                         posMetadata.position.childPos, id);
    585             }
    586 
    587             returnValue = false;
    588         }
    589 
    590         posMetadata.recycle();
    591 
    592         return returnValue;
    593     }
    

    来源: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/widget/ExpandableListView.java#ExpandableListView.handleItemClick%28android.view.View%2Cint%2Clong%29

    这里的问题是,如果行不是header和footer,则不会调用超级类(android.widget.abslistview)的performmiteMclick方法,这是考虑选择模式的方法: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/widget/AbsListView.java#AbsListView.performItemClick%28android.view.View%2Cint%2Clong%29

    因此,唯一的解决方案是在自己的onchilditemclicklistener中实现选择逻辑。下面是用于多项选择的示例代码:

    https://github.com/jiahaoliuliu/ExpandableListViewMultipleChoice

        2
  •  7
  •   kostmo    14 年前

    经过一些研究,答案是“否”。“已检查”状态似乎是由“位置”在内部跟踪的,因此,如果列表中的前一个父项展开,则“父项”(也称为“组”)项A沿被检查的列表向下的方式可能会将其检查转移到其上的子项。

    我最终跟踪了我自己的数据结构中的检查标记。