【问题标题】:Is choiceMode compatible with ExpandableListView?选择模式与 ExpandableListView 兼容吗?
【发布时间】:2014-08-24 20:41:55
【问题描述】:

是否可以在ExpandableListView 上使用android:choiceMode="multipleChoice"setChoiceMode(ListView.CHOICE_MODE_MULTIPLE) 制作多项选择列表?我可以在普通的ListView 上使用CheckBoxes 做到这一点,但它似乎不适用于ExpandableListView。在后者中,单击列表项(父项或子项)不会像在前者中那样影响复选框。

我注意到可以精确单击复选框以使其切换,但这是一个非常小的目标。

这是relevant unanswered forum post

【问题讨论】:

    标签: android


    【解决方案1】:

    默认情况下不是。查看源代码可以看到如下:

    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

    这里的问题是,如果该行既不是页眉也不是页脚,则不会调用超类(android.widget.AbsListView)的方法performItemClick,这是考虑选择模式的方法: 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】:

    经过一番研究,答案是否定的。“已检查”状态似乎是由“位置”在内部跟踪的,因此“父”(又名“组”)项目在检查列表的下方可能会转移其如果列表中的前一个父级已展开,请检查它上面的一个子级。

    我最终在自己的数据结构中跟踪复选标记。

    【讨论】:

    • 非常感谢。这个答案节省了我的时间。
    猜你喜欢
    • 2012-06-06
    • 2016-10-08
    • 2015-11-25
    • 1970-01-01
    • 2014-09-02
    • 2017-03-09
    • 2015-08-09
    • 2018-08-27
    • 2011-12-31
    相关资源
    最近更新 更多