2010-05-12 34 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