Является ли choiceMode совместимым с ExpandableListView? - PullRequest
9 голосов
/ 12 мая 2010

Можно ли создать список с множественным выбором с android:choiceMode="multipleChoice" или setChoiceMode(ListView.CHOICE_MODE_MULTIPLE) на ExpandableListView? Я могу сделать это с CheckBox es на обычном ListView, но, похоже, он не работает с ExpandableListView. Во втором случае нажатие на элемент списка (родительский или дочерний) не влияет на флажок, как в первом.

Я заметил, что можно точно щелкнуть по флажку, чтобы он переключался, но это очень маленькая цель.

Вот соответствующее сообщение форума без ответа .

Ответы [ 2 ]

9 голосов
/ 04 сентября 2013

По умолчанию нет. Проверяя исходный код вы можете увидеть следующее:

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

Проблема здесь в том, что если строка не является ни верхним, ни нижним колонтитулом, метод executeItemClick суперкласса (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 самостоятельно. Вот пример кода для множественного выбора:

https://github.com/jiahaoliuliu/ExpandableListViewMultipleChoice

7 голосов
/ 22 мая 2010

После некоторого исследования ответом является «Нет». Статус «Проверено», по-видимому, отслеживается внутренне «позицией», так что элемент «родитель» (он же «группа»), находящийся в списке, который проверен, может передавать свой отметьте дочернего элемента над ним, расширяется ли предыдущий родитель в списке.

Я закончил отслеживание галочек в моей собственной структуре данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...