質問

I need to be able to create and delete groups in my expandableListAdapter dynamically. I have looked through all that I can find and am stuck. I do not need specific code, but just to be pointed in the right direction.

役に立ちましたか?

解決

First, we need some data structures (keep a reference to them for later use).

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

headerData is the list of groups - HashMap is used since each group can have multiple display values, each of which is mapped onto the layout by key.

childData is the list of items belonging to each group. Its a list of lists, each containing HashMaps - similar to the groups, each child can have multiple display values which are mapped by key.

We supply these datastructures to our ExpandableListAdapter on creation. We're also telling the adapter how the display values should be mapped; in this example both groups and children have two display values, keys "name" and "fields" which are mapped onto text1 and text2 in the supplied layouts.

adapter = new SimpleExpandableListAdapter( SearchLogs.this, 
        headerData, R.layout.customlayout_group,
        new String[] { "name", "fields" }, new int[] { R.id.text1, R.id.text2 }, 
        childData, R.layout.customlayout_child, 
    new String[] { "name", "fields" }, new int[] { R.id.text1, R.id.text2 } );
setListAdapter(adapter);   // assuming you are using ExpandableListActivity

Up to this point we have an empty ExpandableList. We can populate it dynamically (using an AsyncTask for example) by creating HashMaps that supply values for keys we are using and then adding them to our lists.

For example, to add a group with a couple children we might ...

HashMap<String, String> group = new HashMap<String, String>();
group.put("name", "whatever...");
group.put("fields", "...");

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

HashMap<String, Object> child1 = new HashMap<String, Object>();
child1.put("name", "child name");
child1.put("fields", "...");

HashMap<String, Object> child2 = new HashMap<String, Object>();
child2.put("name", "another child");

groupChildren.add(child1);
groupChildren.add(child2);

headerData.add(group);
childData.add(groupChildren);

Each HashMap in headerData corresponds (by order) to an ArrayList in childData, which contains additional HashMaps that define the actual children. SO even if you are adding an empty group, remember to add a corresponding (empty) ArrayList to childData.

We just added a group to the end of the list - we can just as easily insert as long as we are mindful to insert into the same position in both headerData and childData. Removing groups is the same - be certain to remove from the same position of both headerData and childData.

Finally, notify the adapter that the data has changed, which will cause the List to refresh. If using an AsyncTask, this must be done outside of doInBackground (use onProgressUpdate in this case).

adapter.notifyDataSetChanged();

I hope this helps you move in the right direction. ExpandableList, in terms of how data is stored, is definitely one of the more complicated Android views.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top