Как выбрать ребенка в ExpandableListView?

Я уже задавал вопрос, но безуспешно. Так что я спрашиваю еще раз (извините кстати).

У меня все еще есть эта проблема:

Как получить доступ к элементам внутри ExpandableListView?.

Позвольте мне возобновить. У меня есть эта ситуация в моем приложении:

введите здесь описание изображения

Я хочу сделать PerformClick() для 2-го элемента 2-й группы. Все, что я могу сделать на данный момент, это расширить вторую группу с помощью PerformClick(), используя эту строку кода:

 mGattServicesList.performItemClick(mGattServicesList.getChildAt(1), 1, mGattServicesList.getItemIdAtPosition(1));

зная

private ExpandableListView mGattServicesList;

Разве нет очень простого способа выполнитьClick() для элемента внутри группы?

Я хочу сделать это, потому что у меня есть листнер вроде

private final ExpandableListView.OnChildClickListener servicesListClickListner =
        new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
                                        int childPosition, long id) {

Но я не хочу сам нажимать на элемент и не нахожу способа выбрать этот конкретный элемент в этой группе.

заранее спасибо


person Bob    schedule 04.02.2015    source источник


Ответы (2)


Во-первых, ExpandableListView поддерживает простой способ расширить нужную группу:

mGattServicesList.expandGroup(groupPosition);

Программно щелкнуть элемент немного сложно. Вы на правильном пути, используя метод performItemClick(), но вы немного не в том, как его использовать. Я предполагаю, что вы не используете заголовки. Это еще больше усложняет дело.

Сначала вам нужно получить представление, по которому нужно щелкнуть. Как ни странно, это не требование. Вы можете безопасно вызывать performItemClick() с нулевым представлением. Единственным недостатком является то, что ваш дочерний прослушиватель кликов также получит нулевое представление.

//First we need to pack the child's two position identifiers
long packedPos = ExpandableListView.getPackedPositionForChild(int groupPosition, int childPosition);

//Then we convert to a flat position to use with certain ListView methods
int flatPos = mGattServicesList.getFlatListPosition(packedPos);

//Now adjust the position based on how far the user has scrolled the list.
int adjustedPos = flatPos - mGattServicesList.getFirstVisiblePosition();

//If all is well, the adjustedPos should never be < 0
View childToClick = mGattServicesList.getChildAt(adjustedPos);

Теперь нам нужна позиция и идентификатор для передачи на performItemclick(). Вы увидите, что шаги аналогичны получению представления. Так что на самом деле вам не нужно вводить это снова... но чтобы показать, что вам нужно:

//You can just reuse the same variables used above to find the View
long packedPos = ExpandableListView.getPackedPositionForChild(int groupPosition, int childPosition);
int flatPos = mGattServicesList.getFlatListPosition(packedPos);

//Getting the ID for our child
long id = mGattServicesList.getExpandableListAdapter().getChildId(groupPosition, childPosition);

Наконец, вы можете вызвать свой performItemClick():

performItemClick(childToClick, flatPos, id);

Я должен предварить, я не смог проверить этот код на IDE, поэтому могут быть некоторые синтаксические ошибки, которые помешают компиляции. Но в целом должен передать, к сожалению, не такие уж простые шаги в программном щелчке дочернего представления.

Последнее замечание: на предоставленном вами рисунке показано, что количество групп и детей начинается с 1. Имейте в виду, что на самом деле они считаются позициями с нулевым отсчетом. Таким образом, первая группа находится в позиции 0, а первый потомок каждой группы находится в позиции 0.

person Jay Soyer    schedule 05.02.2015
comment
Спасибо за этот ответ! однако кажется, что метод getChildId(groupPosition, childPosition) не существует, и я не могу найти другой метод в developer.android.com/reference/android/widget/ - person Bob; 05.02.2015
comment
Да, это сработало!! Действительно, в строке mGattServicesList.getChildId(groupPosition, childPosition); Я изменил его на: mGattServicesList.getExpandableListAdapter().getChildId(1,2); и сработало отлично, большое спасибо :) - person Bob; 05.02.2015
comment
Рад, что помог. Обновил мой ответ, чтобы исправить ошибку. - person Jay Soyer; 05.02.2015

У вас не может быть слушателя для определенного элемента в списке, но вы можете делать то, что хотите. Просто проверьте, нужны ли вам groupPosition и childPosition, а затем выполните действие (или какое-либо другое действие, подходящее для других элементов).

В ExpandableListView.OnChildClickListener

@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
    //groupPosition tells you what group the clicked child came from
    //childPosition tells you what child was clicked
    if (groupPosition == 2 && childPosition == 2) {
        //so this code only executes if the 2nd child in the 2nd group is clicked 
    }
    //you can ignore the other items or do something else when they are clicked
}
person seiterm    schedule 04.02.2015
comment
Хорошо, но с этим решением мне все равно придется нажимать на ребенка самостоятельно, верно? - person Bob; 04.02.2015
comment
Да.. Я хотел выполнитьClick() в другой функции, чтобы она действительно вызывала onChildClick() - person Bob; 04.02.2015
comment
Ах, мое недоразумение. У меня есть идея. Погоди. - person seiterm; 04.02.2015