首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExpandableListAdapter添加/删除组

ExpandableListAdapter添加/删除组
EN

Stack Overflow用户
提问于 2011-10-02 11:25:00
回答 1查看 2.3K关注 0票数 0

我需要能够在我的expandableListAdapter中动态创建和删除组。我已经找遍了我能找到的所有东西,但我被卡住了。我不需要特定的代码,只是被指向正确的方向。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-03 07:30:43

首先,我们需要一些数据结构(保留对它们的引用以备后用)。

代码语言:javascript
复制
headerData = new ArrayList<HashMap<String, String>>();
childData = new ArrayList<ArrayList<HashMap<String, Object>>>();

headerData是组的列表-使用HashMap是因为每个组可以有多个显示值,每个值都通过键映射到布局上。

childData是属于每个组的项目列表。这是一个列表列表,每个列表都包含HashMaps -类似于组,每个子项可以有多个按键映射的显示值。

我们在创建时将这些数据结构提供给ExpandableListAdapter。我们还告诉适配器应该如何映射显示值;在本例中,组和子对象都有两个显示值,键"name“和"fields”被映射到所提供的布局中的text1和text2。

代码语言:javascript
复制
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 ),然后将它们添加到我们的列表中。

例如,要添加一个包含几个孩子的组,我们可能会...

代码语言:javascript
复制
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的相同位置删除。

最后,通知适配器数据已更改,这将导致列表刷新。如果使用AsyncTask,则必须在doInBackground外部完成(在本例中使用onProgressUpdate )。

代码语言:javascript
复制
adapter.notifyDataSetChanged();

我希望这能帮助你朝着正确的方向前进。就数据存储方式而言,ExpandableList绝对是比较复杂的Android视图之一。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7624407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档