2009-08-30 12 views

Antwort

75

Arbeiten mit SimpleExpandableListAdapter ist alles andere als einfach. Hier ist ein Code, mit dem Sie beginnen sollten, vorausgesetzt, Sie verwenden ExpandableListActivity.

In diesem Beispiel verwenden wir den Standard android.R.layout.simple_expandable_list_item_1 für unsere Gruppenkopfansicht, aber wir verwenden ein eigenes benutzerdefiniertes Layout für die untergeordneten Elemente.

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

Und in Ihrem benutzerdefinierten Kind Layout, mit dem Namen 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

große Antwort hinzufügen, – tomash

+0

Ich wollte nur angenommen werden sollte sagen, dass dies eine ist gutes Beispiel, es war sehr hilfreich! Danke –

+0

@emmby hallo, wie man jedes Bild und Text zu jedem Kind des Elternteils hinzufügt, d. H. – Sultan

6

Sie können versuchen, Ihre eigene Liste Adapter machen, die BaseExpandableListAdapter erstreckt gerade in documentation beschrieben mag.

Dann überschreiben Sie getGroupView(..) (für übergeordnete Artikel oder getChildView für untergeordnete Artikel) -Funktion und in dieser Funktion können Sie Ihr eigenes Layout xml aufblasen.

etwas wie folgt aus:

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

Layout 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

Nachdem Sie getGroupView außer Kraft setzen, können Sie setCompoundDrawablesWithIntrinsicBounds Funktion Bild hinzuzufügen.

@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

Ich habe gerade einen besseren Weg, Sie einfach

android:drawableRight="@drawable/icon" Linie Layout XML-Datei der Liste Gruppe hinzufügen können.

+1

funktioniert wie ein Charme..Einfache und die beste – Prabs

0

Versuchen Sie, diese >>> Tutorial

Und Sie können es aktualisieren, um Bild anstelle von Text in Kind XML-Datei