Я уже задавал вопрос, но безуспешно. Так что я спрашиваю еще раз (извините кстати).
У меня все еще есть эта проблема:
Как получить доступ к элементам внутри 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) {
Но я не хочу сам нажимать на элемент и не нахожу способа выбрать этот конкретный элемент в этой группе.
заранее спасибо
Ответ 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
}