2009-08-30 7 views

Respuesta

75

Trabajar con SimpleExpandableListAdapter es cualquier cosa menos simple. Aquí hay un código que debe comenzar, suponiendo que esté usando ExpandableListActivity.

En este ejemplo, utilizamos el estándar android.R.layout.simple_expandable_list_item_1 para nuestra vista de encabezado de grupo, pero usamos nuestro propio diseño personalizado para los niños.

// Construct Expandable List 
    final String NAME = "name"; 
    final String IMAGE = "image"; 
    final LayoutInflater layoutInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final ArrayList<HashMap<String, String>> headerData = new ArrayList<HashMap<String, String>>(); 

    final HashMap<String, String> group1 = new HashMap<String, String>(); 
    group1.put(NAME, "Group 1"); 
    headerData.add(group1); 

    final HashMap<String, String> group2 = new HashMap<String, String>(); 
    group2.put(NAME, "Group 2"); 
    headerData.add(group2); 


    final ArrayList<ArrayList<HashMap<String, Object>>> childData = new ArrayList<ArrayList<HashMap<String, Object>>>(); 

    final ArrayList<HashMap<String, Object>> group1data = new ArrayList<HashMap<String, Object>>(); 
    childData.add(group1data); 

    final ArrayList<HashMap<String, Object>> group2data = new ArrayList<HashMap<String, Object>>(); 
    childData.add(group2data); 


    // Set up some sample data in both groups 
    for(int i=0; i<10; ++i) { 
     final HashMap<String, Object> map = new HashMap<String,Object>(); 
     map.put(NAME, "Child " + i); 
     map.put(IMAGE, getResources().getDrawable(R.drawable.icon)); 
     (i%2==0 ? group1data : group2data).add(map); 
    } 

    setListAdapter(new SimpleExpandableListAdapter(
      this, 
      headerData, 
      android.R.layout.simple_expandable_list_item_1, 
      new String[] { NAME },   // the name of the field data 
      new int[] { android.R.id.text1 }, // the text field to populate with the field data 
      childData, 
      0, 
      null, 
      new int[] {} 
     ) { 
      @Override 
      public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
       final View v = super.getChildView(groupPosition, childPosition, isLastChild, convertView, parent); 

       // Populate your custom view here 
       ((TextView)v.findViewById(R.id.name)).setText((String) ((Map<String,Object>)getChild(groupPosition, childPosition)).get(NAME)); 
       ((ImageView)v.findViewById(R.id.image)).setImageDrawable((Drawable) ((Map<String,Object>)getChild(groupPosition, childPosition)).get(IMAGE)); 

       return v; 
      } 

      @Override 
      public View newChildView(boolean isLastChild, ViewGroup parent) { 
       return layoutInflater.inflate(R.layout.expandable_list_item_with_image, null, false); 
      } 
     } 
    ); 

Y dentro de su diseño personalizado niño, llamado expandable_list_item_with_image.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 

    <ImageView 
     android:id="@+id/image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:id="@+id/name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="right" /> 

</RelativeLayout> 
+0

gran respuesta, debe ser aceptado – tomash

+0

Sólo quería decir que esta es una gran ejemplo, ¡fue realmente útil! Gracias –

+0

@emmby hola cómo agregar diferentes imágenes y texto a cada hijo de uno de los padres, es decir, – Sultan

6

Puede intentar hacer su propio adaptador de lista que se extiende BaseExpandableListAdapter al igual que se describe en documentation.

Luego, anule getGroupView(..) (para elementos primarios, o getChildView para elementos secundarios) y en esta función puede inflar su propio diseño xml.

algo como esto:

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, 
      ViewGroup parent) 
     { 
      View v = convertView; 
      if (v == null) { 
    //sender is activity from where you call this adapter. Set it with construktor. 
       LayoutInflater vi = (LayoutInflater)sender.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       v = vi.inflate(R.layout.row, null); 
      } 
//children = arraylists of Child 
      Child c = children.get(childPosition); 
      if (c != null) { 
        TextView tt = (TextView) v.findViewById(R.id.toptext); 
        TextView bt = (TextView) v.findViewById(R.id.bottomtext); 
        ImageView icon = (ImageView) v.findViewById(R.id.rowicon); 
        if (tt != null) { 
          tt.setText(c.text1);       } 
        if(bt != null){ 
          bt.setText(c.text2); 
        } 
        if (icon != null) 
        { 
         icon.setImageResource(R.drawable.rowicon); 
        } 
      } 
      return v; 
     } 

diseño xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:padding="6dip"> 
    <ImageView 
     android:id="@+id/rowicon" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_marginRight="6dip" /> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="0dip" 
     android:layout_weight="1" 
     android:layout_height="fill_parent"> 
     <TextView 
      android:id="@+id/toptext" 
      android:layout_width="fill_parent" 
      android:layout_height="0dip" 
      android:layout_weight="1" 
      android:gravity="center_vertical" 
     /> 
     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="0dip" 
      android:layout_weight="1" 
      android:id="@+id/bottomtext" 
      android:singleLine="true" 
      android:ellipsize="marquee" 
     /> 
    </LinearLayout> 
</LinearLayout> 
1

Después se reemplaza getGroupView, puede utilizar setCompoundDrawablesWithIntrinsicBounds función para añadir una imagen.

@Override 
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) 
{ 
    View v = super.getGroupView(groupPosition, isExpanded, convertView, parent); 
    TextView tv = (TextView) v.findViewById(R.id.textViewId); 

    tv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.imageToAdd, 0, 0, 0); 

    return v; 
} 
1

que acaba de encontrar una mejor manera, simplemente puede añadir

android:drawableRight="@drawable/icon" línea a disposición de los archivos XML de grupo de la lista.

+1

funciona como un encanto..Simple y EL MEJOR – Prabs

0

Prueba este >>> Tutorial

Y se puede actualizar con el fin de añadir una imagen en lugar de texto en el archivo XML niño

Cuestiones relacionadas