2012-03-30 14 views
11

Ho creato un ExpandableListView con l'aiuto di questo tutorial: link. Capisco il codice più o meno e ho cercato di impostare un longclicklistener sui gruppi.Android LongClickListener su elementi del gruppo ExpandableListView

C'è un setOnChildClickListener sulle voci figlio già e sono riuscito a impostare un longclicklistener su di loro:

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; 
     } 
    }); 

Come posso impostare un longclicklistener sulle voci del gruppo?

So che il codice è difficile da leggere, quindi ho creato un progetto di esempio e l'ho caricato su here. Questo non ha onlongclicklistener sui childs, poiché questo è quasi l'originale dal link precedente. Gradirei se qualcuno potesse aiutarmi con questo.

risposta

41

Gli elementi di gruppo sono un sottoinsieme di tutti gli elementi, pertanto in entrambi i casi deve essere richiamato il metodo precedente. Dovresti quindi utilizzare getPackedPositionType come sopra per capire se l'elemento selezionato è un gruppo, un elemento o null.

Il codice per questo sarebbe:

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; 
      } 
    }); 

Se si tratta di un gruppo, che verrà utilizzato getPackedPositionGroup come sopra per ottenere l'ID del gruppo che si sta a lungo premuto. Se si tratta di un oggetto, utilizzerai la combinazione di getPackedPositionGroup e getPackedPositionChild.

+0

Wow. È stato così facile Grazie mille! – erdomester

+1

Prego! Se funziona, non dimenticare di accettare/upvotare/etc. :) –

+0

Wow .... Questa implementazione normale, ma perfettamente funzionante, con eventi di gruppo e figlio di dati, l'accesso per la posizione. –

Problemi correlati