A question about ExpandableListViews in Android

Hey,

       I asked a question relating to this a little while back, but I'm still having a problem with getting it to work...

 
import android.app.ExpandableListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ExpandableListView;
import android.widget.SimpleExpandableListAdapter;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;

public class ExpList extends ExpandableListActivity
{
    static final String colors[] = {
	  "grey",
	  "blue",
	  "yellow",
	  "red"
	};

	static final String shades[][] = {
// Shades of grey
	  {
		"one","one B",
		"one","two B",
		"one","three B"
	  },
// Shades of blue
	  {
		"four","four B",
		"five","five B",
		"six","six B"
	  },
// Shades of yellow
	  {
		"seven","seven B",
		"eight","eight B",
		"nine","	nine B"
	  },
// Shades of red
	  {
		"ten","ten B",
		"eleven","eleven B",
		"twelve","twelve B"
	  }
    };

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle)
    {
        super.onCreate(icicle);
        setContentView(R.layout.main);
		SimpleExpandableListAdapter expListAdapter =
			new SimpleExpandableListAdapter(
				this,
				createGroupList(),	// groupData describes the first-level entries
				R.layout.child_row,	// Layout for the first-level entries
				new String[] { "colorName" },	// Key in the groupData maps to display
				new int[] { R.id.childname },		// Data under "colorName" key goes into this TextView
				createChildList(),	// childData describes second-level entries
				R.layout.child_row,	// Layout for second-level entries
				new String[] { "shadeName", "rgb" },	// Keys in childData maps to display
				new int[] { R.id.childname, R.id.rgb }	// Data under the keys above go into these TextViews
			);
		setListAdapter( expListAdapter );
		
		final ExpandableListView elv = this.getExpandableListView();
    
		elv.setOnItemSelectedListener(
				new OnItemSelectedListener()
				{ 
				  			 
				 public void onItemSelected(AdapterView<?> parent, View view,int pos, long id) 
				 {
					 System.out.println(parent.getItemAtPosition(pos).toString());
				 }

				@Override
				public void onNothingSelected(AdapterView<?> arg0) {
					// TODO Auto-generated method stub
					
				}
				});
    }
		
/**
  * Creates the group list out of the colors[] array according to
  * the structure required by SimpleExpandableListAdapter. The resulting
  * List contains Maps. Each Map contains one entry with key "colorName" and
  * value of an entry in the colors[] array.
  */
	private List createGroupList() {
	  ArrayList result = new ArrayList();
	  for( int i = 0 ; i < colors.length ; ++i ) {
		HashMap m = new HashMap();
	    m.put( "colorName",colors[i] );
		result.add( m );
	  }
	  return (List)result;
    }

/**
  * Creates the child list out of the shades[] array according to the
  * structure required by SimpleExpandableListAdapter. The resulting List
  * contains one list for each group. Each such second-level group contains
  * Maps. Each such Map contains two keys: "shadeName" is the name of the
  * shade and "rgb" is the RGB value for the shade.
  */
  private List createChildList() {
	ArrayList result = new ArrayList();
	for( int i = 0 ; i < shades.length ; ++i ) {
// Second-level lists
	  ArrayList secList = new ArrayList();
	  for( int n = 0 ; n < shades[i].length ; n += 2 ) {
	    HashMap child = new HashMap();
		child.put( "shadeName", shades[i][n] );
	    child.put( "rgb", shades[i][n+1] );
		secList.add( child );
	  }
	  result.add( secList );
	}
	return result;
  }

}

Open in new window


I still can't figure out how to figure out what child is clicked, and get the data from that particular child.

Could anyone please help me out?

Thanks in advance!
errangAsked:
Who is Participating?
 
Dejan PažinHead of SW DevelopmentCommented:

There are two changes you need to make in your code:

1. Dont use the setOnItemSelectedListener method, use the setOnChildClickListener and setOnGroupClickListener methods instead.

2. Dont use parent.getItemAtPosition(pos), use parent.getExpandableListAdapter().getGroup(pos)) and parent.getExpandableListAdapter().getChild(groupPos, itemPos)

Here is a sample code:




               
elv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            public boolean onChildClick(ExpandableListView parent, View view, int groupPos, int itemPos, long l) {
                System.out.println("Group: " + parent.getExpandableListAdapter().getGroup(groupPos));
                System.out.println("Item: " + parent.getExpandableListAdapter().getChild(groupPos, itemPos));

                return false;
            }
        });

elv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            public boolean onGroupClick(ExpandableListView parent, View view, int groupPos, long l) {
                System.out.println("Group: " + parent.getExpandableListAdapter().getGroup(groupPos));
                return false;
            }
        });

Open in new window

0
 
errangAuthor Commented:
Ah, sweet, thanks!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.