2012-03-30 20 views
11

Creé un ExpandableListView con la ayuda de este tutorial: link. Entiendo el código más o menos y he estado tratando de configurar longclicklistener en los grupos.Android LongClickListener en elementos del grupo ExpandableListView

Hay una setOnChildClickListener sobre los elementos secundarios ya y logró establecer un longclicklistener en ellos:

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

¿Cómo puedo configurar un longclicklistener sobre los elementos del grupo?

Sé que el código es difícil de leer, así que creé un proyecto de muestra y lo cargué en here. Esto no tiene onlongclicklistener en los niños, ya que este es casi el original del enlace de arriba. Agradecería si alguien pudiera ayudarme con esto.

Respuesta

41

Los elementos de grupo son un subconjunto de todos los elementos, por lo que el método anterior debe invocarse en ambos casos. A continuación, utilizaría getPackedPositionType como se indica arriba para averiguar si el elemento seleccionado es un grupo, un elemento o nulo.

El código para esto sería:

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

Si se trata de un grupo, va a utilizar getPackedPositionGroup como antes para obtener el ID de grupo que está siendo presionado largo. Si es un artículo, usará la combinación de getPackedPositionGroup y getPackedPositionChild.

+0

Wow. Esto fue tan fácil. ¡Muchas gracias! – erdomester

+1

¡De nada! Si funciona, no te olvides de aceptar/upvote/etc. :) –

+0

Wow ... Esta implementación normal pero perfectamente funciona bien con eventos de grupo e hijos de acceso a datos para el puesto. –

Cuestiones relacionadas