Search code examples
androidlistandroid-activityexpandable

How to inflate a expandable list in Android?


i want to inflate a expandable list with some different text and different images on each row if i use albumCovers.get(i) instead of getResources().getDrawable(R.drawable.icon)then it throws an error, any one help us out? thanks ;p.

public class ExpandActivity extends ExpandableListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

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

    Resources res = this.getResources();
    Drawable photo = (Drawable) res.getDrawable(R.drawable.icon);
    ArrayList<Drawable> albumCovers = new ArrayList<Drawable>();
    albumCovers.add(photo);
    // 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));
        (group1data).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);
        }
    });
}
}

Solution

  • You have only one drawable in albumCovers but loop it ten times in the for loop and try to access it by the index. Change albumCovers.get(i) to albumCovers.get(0) for it to work.

    Here is the key location:

    Drawable photo = (Drawable) res.getDrawable(R.drawable.icon); 
    ArrayList<Drawable> albumCovers = new ArrayList<Drawable>();
    albumCovers.add(photo); // HERE: photo added only once!
    
    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)); // HERE: you wanted to use albumCovers.get(i) here. There is only 1 photo in albumCovers but you try to get images 0...9 from it using index i. So, change this to albumCovers.get(0) OR add 10x photo into albumCovers.
        (group1data).add(map);
    }