Hey Luke,

Sure, I managed to solve it myself after several tedious hours ;)
It took a trip to the Android source code to get a working solution
though, here it goes.

What I wanted to achieve was to have my own layout for each child in
an expandable list. E.g. I wanted to define two TextViews and one
ImageView and I wanted to tell Android what view to bind my data to
(e.g. String 1 to TextView 1, String 2 to TextView 2, Drawable 1 to
the ImageView).

Here is the solution (I will include the whole src file and xml layout
as im not sure how well you understand Expandable Lists):

Java:
====================

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.ExpandableListActivity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ImageView;
import android.widget.SimpleExpandableListAdapter;
import android.widget.TextView;

/**
 * Demonstrates expandable lists using a custom {...@link
ExpandableListAdapter}
 * from {...@link BaseExpandableListAdapter}.
 */
public class Media extends ExpandableListActivity {

        ExpandableListAdapter mAdapter;

        private static final String NAME = "NAME";
        private static final String NUM_PHOTOS = "NUM_PHOTOS";
        private Resources res;
        private Drawable photo, photo2;
        private List<Drawable> albumCovers;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.media_layout);

                // Create a List of Drawables to insert into the Expandable List
                // This can be completely dynamic
                res = this.getResources();
                photo = (Drawable) res.getDrawable(R.drawable.photo_album);
                photo2 = (Drawable) res.getDrawable(R.drawable.photo_album2);
                albumCovers = new ArrayList<Drawable>();
                albumCovers.add(photo);
                albumCovers.add(photo2);

                // The following code simply generates the Expandable Lists 
content
(Strings)
                List<Map<String, String>> groupData = new ArrayList<Map<String,
String>>();
                List<List<Map<String, String>>> childData = new
ArrayList<List<Map<String, String>>>();

                Map<String, String> curGroupMap = new HashMap<String, String>();
                groupData.add(curGroupMap);
                curGroupMap.put(NAME, "Photos");
                curGroupMap.put(NUM_PHOTOS, "");

                List<Map<String, String>> children = new ArrayList<Map<String,
String>>();
                Map<String, String> curChildMap = new HashMap<String, String>();
                children.add(curChildMap);

                curChildMap.put(NAME, "Profile Pictures");
                curChildMap.put(NUM_PHOTOS, "20 Photos");

                curChildMap = new HashMap<String, String>();
                children.add(curChildMap);

                curChildMap.put(NAME, "Vancouver 2008");
                curChildMap.put(NUM_PHOTOS, "32 Photos");

                childData.add(children);

                curGroupMap = new HashMap<String, String>();
                groupData.add(curGroupMap);

                curGroupMap.put(NAME, "Videos");
                curGroupMap.put(NUM_PHOTOS, "");

                children = new ArrayList<Map<String, String>>();

                curChildMap = new HashMap<String, String>();
                children.add(curChildMap);

                curChildMap.put(NAME, "Floatplane Takeoff");
                curChildMap.put(NUM_PHOTOS, "2:26");

                childData.add(children);

                // Set up our adapter
                mAdapter = new MyExpandableListAdapter(
                                this,
                                groupData,
                                R.layout.media_list_parent,
                                new String[] { NAME, NUM_PHOTOS },
                                new int[] { R.id.rowText1, R.id.rowText2, 
R.id.photoAlbumImg },
                                childData,
                                R.layout.media_list_child,
                                new String[] { NAME, NUM_PHOTOS },
                                new int[] { R.id.rowText1, R.id.rowText2, 
R.id.photoAlbumImg }
                        );
                setListAdapter(mAdapter);
                registerForContextMenu(getExpandableListView());
        }


        /**
         * A simple adapter which allows you to bind data to specific
         * Views defined within the layout of an Expandable Lists children
         * (Implement getGroupView() to define the layout of parents)
         */
        public class MyExpandableListAdapter extends
SimpleExpandableListAdapter {

                private List<? extends List<? extends Map<String, ?>>> 
mChildData;
                private String[] mChildFrom;
                private int[] mChildTo;

                public MyExpandableListAdapter(Context context,
                                List<? extends Map<String, ?>> groupData, int 
groupLayout,
                                String[] groupFrom, int[] groupTo,
                                List<? extends List<? extends Map<String, ?>>> 
childData,
                                int childLayout, String[] childFrom, int[] 
childTo) {
                        super(context, groupData, groupLayout, groupFrom, 
groupTo,
                                        childData, childLayout, childFrom, 
childTo);

                        mChildData = childData;
                        mChildFrom = childFrom;
                        mChildTo = childTo;

                }

                public View getChildView(int groupPosition, int childPosition,
                                boolean isLastChild, View convertView, 
ViewGroup parent) {

                        View v;
                        if (convertView == null) {
                                v = newChildView(isLastChild, parent);
                        } else {
                                v = convertView;
                        }
                        bindView(v, 
mChildData.get(groupPosition).get(childPosition),
mChildFrom,
                                        mChildTo, groupPosition, childPosition);
                        return v;
                }

                // This method binds my data to the Views specified in the 
child xml
layout
                private void bindView(View view, Map<String, ?> data,
                                String[] from, int[] to, int groupPosition, int 
childPosition) {
                        int len = to.length - 1;
                        // Apply TextViews
                        for (int i = 0; i < len; i++) {
                                TextView v = (TextView) 
view.findViewById(to[i]);
                                if (v != null) {
                                        v.setText((String) data.get(from[i]));
                                }

                        }
                        // Apply ImageView
                        ImageView imgV = (ImageView) view.findViewById(to[2]);
                        if (imgV != null) {
                                if(childPosition % 2 == 0) 
imgV.setImageDrawable(albumCovers.get
(0));
                                else imgV.setImageDrawable(albumCovers.get(1));
                        }
                }
        }
}


Layout: media_layout.xml
(For the main activity holding the Expandable List)
========================================

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/
android"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:paddingTop="104px">

        <ExpandableListView android:id="@+id/android:list"
                android:layout_width="fill_parent"
android:layout_height="fill_parent"
                android:layout_weight="1" android:drawSelectorOnTop="false"
android:background="#3f3f3f" />

        <TextView android:id="@+id/android:empty"
android:layout_width="fill_parent"
                android:layout_height="fill_parent" android:text="No Media" />

</LinearLayout>


Layout: media_list_parent.xml
(Defines the layout for parents in the Expandable List)
========================================

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/
android"
        android:orientation="horizontal" android:layout_width="fill_parent"
        android:layout_height="75sp" android:background="#dedede"
android:gravity="center_vertical">

        <TextView android:id="@+id/rowText1"
android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:paddingLeft="40sp"
style="@style/ListParent" />

        <TextView android:id="@+id/rowText2"
android:layout_width="fill_parent"
                android:layout_height="wrap_content" style="@style/ListParent" 
/>

</LinearLayout>


Layout: media_list_child.xml
(Defines the layout for children in the Expandable List)
=========================================

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/
android"
        android:orientation="horizontal" android:layout_width="fill_parent"
        android:layout_height="70sp" android:gravity="center_vertical">

        <ImageView android:id="@+id/photoAlbumImg"
android:layout_width="70px"
                                android:layout_height="70px" />

        <TextView android:id="@+id/rowText1"
android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:paddingLeft="10sp"
style="@style/ListChild" />

        <TextView android:id="@+id/rowText2"
android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:paddingLeft="95sp"
style="@style/ListChild" />

</LinearLayout>


================


There you have it, this will allow you to have an Expandable list
which uses views completely designed by yourself.

Took me a while to solve it, hope it helps you. Let me know if it
does!

-Miles

On Dec 18, 10:03 am, "Luke w" <hit...@gmail.com> wrote:
> Hi mscwd01,
> How about the result ?
> could you give some comment ?
>
> BR,
> Luke Wang
>
> Jay London  - "I was going to buy a book on hair loss, but the pages kept
> falling out."
>
> On Tue, Dec 16, 2008 at 12:11 AM, mscwd01 <mscw...@gmail.com> wrote:
>
> > Brilliant! Thanks for taking the time to show me this.
>
> > I'll have a play and see what I come up with :)
>
> > On Dec 15, 2:01 pm, "Gnanesh Radhakrishnan" <gnanesh....@gmail.com>
> > wrote:
> > > Sorry... you include dynamic images also to the textview.
> > > Please refer to setCompoundDrawablesWithIntrinsicBounds method. This
> > might
> > > help.
>
> > >http://code.google.com/android/reference/android/widget/TextView.html..
> > .)
>
> > > Gyan.
>
> > > On Mon, Dec 15, 2008 at 7:18 PM, Gnanesh Radhakrishnan <
>
> > > gnanesh....@gmail.com> wrote:
>
> > > > Hey,
>
> > > > You can use a SimpleExpandableListAdapter to achieve this.
>
> > > > SimpleExpandableListAdapter expListAdapter =
> > > >             new SimpleExpandableListAdapter(
> > > >                 this,
> > > >                 createGroupList(),    // groupData describes the
> > > > first-level entries
> > > >                 R.layout.group_row,    // Layout for the first-level
> > > > entries
> > > >                 new String[] { "colorName" },    // Key in the
> > groupData
> > > > maps to display
> > > >                 new int[] { R.id.groupname },        // Data under
> > > > "colorName" key goes into this TextView
> > > >                 createChildList(),    // childData describes
> > second-level
> > > > entries
> > > >                 R.layout.child_table,    // Layout for second-level
> > entries
> > > >                 new String[] { "childTextView1", "childTextView2" },
> >  //
> > > > Keys in childData maps to display
> > > >                 new int[] { R.id.childtablename, R.id.view2table }
> >  //
> > > > Data under the keys above go into these TextViews
> > > >             );
>
> > > > This will allow you to specify different formatting to the child and
> > > > parent. As u can see in "R.layout.group_row" you can specify the layout
> > > > settings of the parent and "R.layout.child_table" for the child.
> > > > Albeit, you can only have text views in the expandable list. But you
> > can
> > > > include an imageView (which is going to be static and not dynamic) in
> > the
> > > > appropriate layout for displaying images in the expandable list view.
>
> > > > Gyan.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers-unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to