我需要能够动态地在我的expandableListAdapter中创建和删除组。我已经查看了所有可以找到的内容并且卡住了。我不需要特定的代码,只是指向正确的方向。
答案 0 :(得分:3)
首先,我们需要一些数据结构(保留对它们的引用以供以后使用)。
headerData = new ArrayList<HashMap<String, String>>();
childData = new ArrayList<ArrayList<HashMap<String, Object>>>();
headerData是组列表 - 使用HashMap,因为每个组可以有多个显示值,每个显示值都按键映射到布局上。
childData是属于每个组的项目列表。它是一个列表列表,每个列表包含HashMaps - 类似于组,每个子节点可以有多个按键映射的显示值。
我们在创建时将这些数据结构提供给ExpandableListAdapter。我们还告诉适配器应该如何映射显示值;在此示例中,组和子组都有两个显示值,键“name”和“fields”,它们映射到提供的布局中的text1和text2。
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
到目前为止,我们有一个空的ExpandableList。我们可以通过创建HashMaps来动态填充它(例如使用AsyncTask),HashMaps为我们正在使用的键提供值,然后将它们添加到我们的列表中。
例如,要添加一个包含几个孩子的小组,我们可能会......
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);
headerData中的每个HashMap(按顺序)对应于childData中的ArrayList,其中包含定义实际子节点的其他HashMaps。即使你要添加一个空组,也要记得在childData中添加一个相应的(空)ArrayList。
我们刚刚在列表的末尾添加了一个组 - 只要我们注意插入headerData和childData中的相同位置,我们就可以轻松插入。删除组是相同的 - 确保从headerData和childData的相同位置删除。
最后,通知适配器数据已更改,这将导致List刷新。如果使用AsyncTask,则必须在doInBackground之外完成(在这种情况下使用onProgressUpdate)。
adapter.notifyDataSetChanged();
我希望这能帮助你朝着正确的方向前进。就数据存储方式而言,ExpandableList绝对是更复杂的Android视图之一。