2012-03-30 6 views
11

Utworzono ExpandableListView za pomocą tego samouczka: link. Rozumiem kod mniej więcej i próbowałem ustawić longclicklistener na grupach.Android LongClickListener na artykułach grupy ExpandableListView

Jest setOnChildClickListener na pozycji dziecka i już udało mi się ustawić longclicklistener na nich:

exList.setOnItemLongClickListener(new OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
      if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_CHILD) { 
       groupPosition = ExpandableListView.getPackedPositionGroup(id); 
       childPosition = ExpandableListView.getPackedPositionChild(id); 
//[....] 
return false; 
     } 
    }); 

Jak mogę ustawić longclicklistener na pozycji grupowych?

Wiem, że kod jest trudny do odczytania, więc utworzyłem przykładowy projekt i przesłałem go do here. To nie ma onlongclicklistener na childs, ponieważ jest prawie oryginalny z powyższego łącza. Byłbym wdzięczny, gdyby ktoś mógł mi w tym pomóc.

Odpowiedz

41

Elementy grupy są podzbiorem wszystkich pozycji, dlatego powyższa metoda powinna zostać wywołana w obu przypadkach. Następnie należy użyć metody getPackedPositionType, jak powyżej, aby dowiedzieć się, czy wybrany element jest grupą, elementem lub wartością pustą.

Kod tego będzie:

exList.setOnItemLongClickListener(new OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
      int itemType = ExpandableListView.getPackedPositionType(id); 

      if (itemType == ExpandableListView.PACKED_POSITION_TYPE_CHILD) { 
       childPosition = ExpandableListView.getPackedPositionChild(id); 
       groupPosition = ExpandableListView.getPackedPositionGroup(id); 

       //do your per-item callback here 
       return retVal; //true if we consumed the click, false if not 

      } else if(itemType == ExpandableListView.PACKED_POSITION_TYPE_GROUP) { 
       groupPosition = ExpandableListView.getPackedPositionGroup(id); 
       //do your per-group callback here 
       return retVal; //true if we consumed the click, false if not 

      } else { 
       // null item; we don't consume the click 
       return false; 
      } 
    }); 

Jeśli jest to grupa, będziemy używać getPackedPositionGroup jak powyżej, aby uzyskać identyfikator grupy, która jest długo wciśnięty. Jeśli jest to przedmiot, użyjesz kombinacji getPackedPositionGroup i getPackedPositionChild.

+0

Wow. To było takie łatwe. Dziękuję Ci bardzo! – erdomester

+1

Nie ma za co! Jeśli to działa, nie zapomnij przyjąć/upvote/etc. :) –

+0

Wow .... To normalnie implementacja, ale doskonale działa dobrze z grupowymi i podrzędnymi zdarzeniami dostępu do danych dla pozycji. –