Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: BobОтветов: 2

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

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

Как получить доступ к элементам внутри 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) {

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

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

androidlistviewexpandablelistview

Ответы

Ответ 1 · рейтинг 9 · Jay Soyer

Во-первых, 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.

Ответ 2 · seiterm

У вас не может быть слушателя для определенного элемента в списке, но вы можете делать то, что хотите. Просто проверьте, нужны ли вам 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
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы