2015-02-04 3 views
3

Я уже задал вопрос, но безуспешно. Поэтому я снова спрашиваю (извините, кстати).Как выбрать ребенка в ExpandableListView?

Я до сих пор этот вопрос:

How to access items inside ExpandableListView?.

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

enter image description here

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

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

зная

private ExpandableListView mGattServicesList; 

Не существует очень простой способ performClick() к элементу внутри группы?

Я хочу, чтобы это сделать, потому что я потом как

у слушателя
private final ExpandableListView.OnChildClickListener servicesListClickListner = 
     new ExpandableListView.OnChildClickListener() { 
      @Override 
      public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, 
             int childPosition, long id) { 

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

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

ответ

8

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

+0

Спасибо за этот ответ! однако кажется, что метод getChildId (groupPosition, childPosition) не существует, и я не могу найти другой метод в http://developer.android.com/reference/android/widget/ExpandableListView.html#getSelectedId%28%29 – Bob

+0

Nevermind, он действительно существует с помощью адаптера – Bob

+0

Да, это сработало !! Действительно, в строке mGattServicesList.getChildId (groupPosition, childPosition); Я изменил его на: mGattServicesList.getExpandableListAdapter(). GetChildId (1,2); и работал отлично, спасибо большое :) – Bob

0

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

Хорошо, но с этим решением мне все равно придется щелкнуть ребенка самостоятельно? – Bob

+0

Да .. Я хотел выполнитьClick() в другой функции, чтобы он на самом деле вызывалChildClick() – Bob

+0

А, мое недоразумение. У меня есть мысль. Дай мне секунду. – seiterm

Смежные вопросы