2010-05-12 49 views
9

是否有可能通过android:choiceMode="multipleChoice"setChoiceMode(ListView.CHOICE_MODE_MULTIPLE)ExpandableListView上作出多项选择列表?我可以用CheckBox es在普通的ListView上做到这一点,但它似乎没有与ExpandableListView一起使用。在后者中,单击列表项(父代或子代)不会影响复选框,就像在前者中那样。是choiceMode兼容ExpandableListView?

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

这是relevant unanswered forum post

回答

7

经过一番研究后,答案是否定的。“检查”状态似乎由“位置”在内部进行跟踪,以便“检查”列表中的“父”(又名“组”如果列表中的前一个父项已展开,则将其检查到其上方的子项。

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

+0

非常感谢。这个答案节省了我的时间。 – 2016-08-10 07:19:25

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

这里的问题是,如果该行不头没有尾,超类的方法performItemClick(android.widget.AbsListView )将不会被调用,这是考虑到选择模式的人: 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 ourelf中实现选择逻辑。以下是多项选择的示例代码:

https://github.com/jiahaoliuliu/ExpandableListViewMultipleChoice

+0

感谢您的简单解决方案! – 2015-02-13 13:15:38