choiceMode是否与ExpandableListView兼容?

时间:2010-05-12 01:39:43

标签: android

是否可以在android:choiceMode="multipleChoice"上使用setChoiceMode(ListView.CHOICE_MODE_MULTIPLE)ExpandableListView制作多选列表?我可以在普通CheckBox上使用ListView es执行此操作,但似乎无法使用ExpandableListView。在后者中,单击列表项(父项或子项)不会影响复选框,就像前者一样。

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

这是relevant unanswered forum post

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:7)

经过一番研究后,答案是否定为“已检查”状态似乎在内部通过“位置”进行跟踪,因此“检查”列表中的“父”(又称“组”)项目可以转移到如果列表中的前一个父项已展开,请检查其上方的子项。

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