2012-03-22 21 views
45

Estoy tratando de programar una interfaz de Android que utiliza una lista ampliable en el lado y un fragmento en el otro lado para que pueda cargar diferentes recursos haciendo clic en los elementos secundarios de la lista desplegable. Pero desafortunadamente no puedo encontrar buenos tutoriales sobre esta lista en ninguna parte. Sí, he buscado en las demostraciones de API y he hecho una lista normal con un BaseExpandableListAdapter, pero aun así, entender esa lista es bastante difícil sin un buen tutorial, ¿tiene alguna buena información o información que pueda verificar?Android ExpandableListView - Buscando un tutorial

+0

No puedo creer lo que estaba marcado como "no constructiva"! Fue muy constructivo, ¡y las respuestas fueron muy útiles! Gracias por publicar esta pregunta, DeX03. –

Respuesta

50

puede encontrar ejemplo de trabajo de la vista de lista ampliable mediante enlaces siguientes:

para hacer clic en el niño, puede manejar de esta manera.

getExpandableListView().setOnChildClickListener(new OnChildClickListener() {     
    public boolean onChildClick(ExpandableListView parent, View v, 
       int groupPosition, int childPosition, long id) { 
     // your code... 
    } 
}); 

Espero que esto te ayude. Gracias ..

+0

pero eso no funciona de la misma manera para las actividades que no extienden ExpandableListActivity porque eso es lo que tengo, ¿cómo puedo arreglarlo para trabajar en ese? – DeX03

+0

nunca lo acabo de arreglar, ¡gran ayuda! – DeX03

58

Crear lista de elementos

List<ParentItem> itemList = new ArrayList<ParentItem>(); 

ParentItem parent1 = new ParentItem(); 
parent1.getChildItemList().add(new ChildItem()); 
parent1.getChildItemList().add(new ChildItem()); 
parent1.getChildItemList().add(new ChildItem()); 

ParentItem parent2 = new ParentItem(); 
parent2.getChildItemList().add(new ChildItem()); 
parent2.getChildItemList().add(new ChildItem()); 
parent2.getChildItemList().add(new ChildItem()); 

itemList.add(parent1); 
itemList.add(parent2); 

ExpandableListViewAdapter adapter = new ExpandableListViewAdapter(context, itemList); 

de objetos de datos

public class ParentItem { 

     private List<ChildItem> childItemList; 

     public ParentItem() { 
       childItemList = new ArrayList<ChildItem>(); 
     } 

     public List<ChildItem> getChildItemList() { 
       return childItemList; 
     } 
} 

public class ChildItem { 
     // filll with your data 
} 

adaptador

public class ExpandableListViewAdapter extends BaseExpandableListAdapter { 

     private static final class ViewHolder { 
       TextView textLabel; 
     } 

     private final List<ParentItem> itemList; 
     private final LayoutInflater inflater; 

     public ExpandableListViewAdapter(Context context, List<ParentItem> itemList) { 
       this.inflater = LayoutInflater.from(context); 
       this.itemList = itemList; 
     } 

     @Override 
     public ChildItem getChild(int groupPosition, int childPosition) { 

       return itemList.get(groupPosition).getChildItemList().get(childPosition); 
     } 

     @Override 
     public long getChildId(int groupPosition, int childPosition) { 
       return childPosition; 
     } 

     @Override 
     public int getChildrenCount(int groupPosition) { 
       return itemList.get(groupPosition).getChildItemList().size(); 
     } 

     @Override 
     public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, 
           final ViewGroup parent) { 
       View resultView = convertView; 
       ViewHolder holder; 


       if (resultView == null) { 

         resultView = inflater.inflate(android.R.layout.test_list_item, null); //TODO change layout id 
         holder = new ViewHolder(); 
         holder.textLabel = (TextView) resultView.findViewById(android.R.id.title); //TODO change view id 
         resultView.setTag(holder); 
       } else { 
         holder = (ViewHolder) resultView.getTag(); 
       } 

       final ChildItem item = getChild(groupPosition, childPosition); 

       holder.textLabel.setText(item.toString()); 

       return resultView; 
     } 

     @Override 
     public ParentItem getGroup(int groupPosition) { 
       return itemList.get(groupPosition); 
     } 

     @Override 
     public int getGroupCount() { 
       return itemList.size(); 
     } 

     @Override 
     public long getGroupId(final int groupPosition) { 
       return groupPosition; 
     } 

     @Override 
     public View getGroupView(int groupPosition, boolean isExpanded, View theConvertView, ViewGroup parent) { 
       View resultView = theConvertView; 
       ViewHolder holder; 

       if (resultView == null) { 
         resultView = inflater.inflate(android.R.layout.test_list_item, null); //TODO change layout id 
         holder = new ViewHolder(); 
         holder.textLabel = (TextView) resultView.findViewById(android.R.id.title); //TODO change view id 
         resultView.setTag(holder); 
       } else { 
         holder = (ViewHolder) resultView.getTag(); 
       } 

       final ParentItem item = getGroup(groupPosition); 

       holder.textLabel.setText(item.toString()); 

       return resultView; 
     } 

     @Override 
     public boolean hasStableIds() { 
       return true; 
     } 

     @Override 
     public boolean isChildSelectable(int groupPosition, int childPosition) { 
       return true; 
     } 

} 

Le da

============================== 
+Parent 1 
============================== 
-child 1.1 
============================== 
-child 1.2 
============================== 
-child 1.3 
============================== 
+Parent 2 
============================== 
-child 2.1 
============================== 
-child 2.2 
============================== 
-child 2.3 
============================== 
+1

pero, ¿cómo puedo manejar el evento click en los elementos secundarios de las listas? porque ese es el problema principal con todos los tutoriales que he encontrado – DeX03

+0

'Semi colon (;)' faltante ' itemList = new ArrayList ()' –

+1

Obtengo nulo 'holder.textLabel.setText (item.toString()); ', ¿Cómo lo solucionó? –

1

De esta manera puede manejar eventos:

getExpandableListView().setOnChildClickListener(new OnChildClickListener() 
{    
    public boolean onChildClick(ExpandableListView parent, 
     View v, int groupPosition, int childPosition, long id) 
    { 
     // your code... 
    } 
} 
+2

respuesta irrelevante .... –

Cuestiones relacionadas