[更新代码] (对不起家伙,我没有提供完整的代码,因为根据我的经验,大型代码似乎“吓跑”可能的帮助者。)
对于ExpandableListView,我想构建一个HashMap<String, ArrayList<String>>
,其中String
是类别的名称,ArrayList<String>
属于该类别的动物的名称。我这样填充HashMap:
HashMap<String, ArrayList<String>> map_groups_childs;
ArrayList<String> list_group_titles;
private void prepareListData(ArrayList<Id_triv_cat> search_results) {
list_group_titles = new ArrayList<String>(); // this is a list of group titles
map_groups_childs = new HashMap<String, ArrayList<String>>(); // this is a map. each group title gets a list of its respective childs
// temporary List of items for a certain category/group
ArrayList<String> temp_childs_list = new ArrayList<String>();
// "search_results" is an ArrayList of self defined objects each containing an ID, a name and a category name
int count = search_results.size();
int i_cat = 0;
int i=0;
// if category "i" is the same as the next category "i+1", add child to list
for (i=0; i<count-1; i++) {
// build group with category name
list_group_titles.add(search_results.get(i).get_type());
// while category does not change, add child to the temporary childs-array
while (i<=count && search_results.get(i).get_type().equals(search_results.get(i+1).get_type())) {
temp_childs_list.add(search_results.get(i).get_name());
i++;
}
// must be done, as the while loop does not get to the last "i" of every category
temp_childs_list.add(search_results.get(i).get_name());
Log.i("DEBUG", temp_childs_list.size()); // --> returns always more than 0
Log.i("DEBUG", temp_childs_list.toString()); // --> returns always something like [word1, word2, word3, ...]
Log.i("DEBUG", list_group_titles.get(i_cat)); // --> returns always a single word like "Insekten"
// add [group_title:list_of_childs] to map
map_groups_childs.put(list_group_titles.get(i_cat++), temp_childs_list);
// clear temp_list, otherwise former category's species will be added to new category
temp_childs_list.clear();
}
Log.i("DEBUG", map_groups_childs.containsKey("Insekten")); // --> returns true
Log.i("DEBUG", map_groups_childs.size()); // --> returns 10
Log.i("DEBUG", map_groups_childs.get("Insekten").size()); // --> returns 0
Log.i("DEBUG", map_groups_childs.toString()); // --> returns {Insekten=[], Reptilien=[], ...}
}
在for循环和while循环中使用相同的i
可能看似错误或令人困惑,但它没关系。不会以任何方式跳过i
或使用两次。
我放在HashMap中的所有键都在那里,但我想要的(例如)map_groups_childs.get("Insekten")
的ArrayList是空的。我做错了什么?
答案 0 :(得分:2)
我可以告诉您需要的是下面第二组中的5行
HashMap<String, ArrayList<String>> map_groups_childs = new HashMap<String, ArrayList<String>>();
ArrayList<String> list_group_titles = new ArrayList<String>();
ArrayList<String> temp_childs_list = new ArrayList<String>();
list_group_titles.add("insects");
temp_childs_list.add("Swallowtail");
temp_childs_list.add("Small White");
temp_childs_list.add("Large White");
temp_childs_list.add("Silverfish");
int k = 0;
Log.i("DEBUG", list_group_titles.get(k)); // --> returns "insects"
Log.i("DEBUG", temp_childs_list); // --> returns [Swallowtail, Small White, Large White, Silverfish]
map_groups_childs.put(list_group_titles.get(k), temp_childs_list);
Log.i("DEBUG", map_groups_childs.size()); // --> returns 1 not 10
Log.i("DEBUG", map_groups_childs.containsKey("insects")); // --> returns true
Log.i("DEBUG", map_groups_childs.get("insects").size()); // --> returns 4 not 0
答案 1 :(得分:2)
即使进行了编辑,您的代码仍然缺少有关正在发生的事情的巨大线索。我做了一些猜测,如果我是对的,你就是这么做的。
我推断出存在一个名为Id_triv_cat
和get_name()
的getter的类get_type()
。
static class Id_triv_cat {
String type;
String name;
Id_triv_cat( String type, String name )
{
this.name = name;
this.type = type;
}
public String get_type()
{
return type;
}
public String get_name()
{
return name;
}
}
我还编写了此代码来测试您的prepareListData()
方法。
public static void main(String[] args){
ArrayList<Id_triv_cat> search_results = new ArrayList<Id_triv_cat>();
search_results.add( new Id_triv_cat("type1", "name1") );
search_results.add( new Id_triv_cat("type2", "name2") );
search_results.add( new Id_triv_cat("Insekten", "insekten name1") );
search_results.add( new Id_triv_cat("Insekten", "insekten name2") );
search_results.add( new Id_triv_cat("type3", "name3") );
new Test().myPrepareListData( search_results );
}
虽然我可以修复你的小缺陷,就像一个好的SE居民一样,但是我冒着将所有这些迁移到程序员的风险,因为你最大的问题是设计问题。您的代码缺乏明确的本地标识符。你没有制作本地人,而是使用了java实用程序类,这使得你的代码变得毫无意义。
如果我怀疑您尝试使用list
Id_triv_cat
private void myPrepareListData(ArrayList<Id_triv_cat> search_results) {
// Each group title is mapped to a list of its respective children
HashMap<String, ArrayList<String>> my_map_groups_childs =
new HashMap<String, ArrayList<String>>();
for (Id_triv_cat search_result : search_results)
{
String type = search_result.get_type();
String name = search_result.get_name();
if ( my_map_groups_childs.containsKey(type) )
{
ArrayList<String> names = my_map_groups_childs.get(type);
names.add(name);
}
else
{
ArrayList<String> names = new ArrayList<String>();
names.add(name);
my_map_groups_childs.put(type, names);
}
}
Log.i("DEBUG", "my_map_groups_childs = " + my_map_groups_childs);
}
使用其类型作为键并将名称作为值来构建地图,请尝试以下操作:< / p>
my_map_groups_childs = {Insekten=[insekten name1, insekten name2], type1=[name1], type3=[name3], type2=[name2]}
显示:{{1}}
了解一些精心挑选的本地人如何让生活变得如此轻松?
如果那不是你想要的,你就必须让你的问题更清楚。
Radiodef是对的。在用Java编写代码时,你真的应该使用camelCase。
答案 2 :(得分:2)
...
map_groups_childs.put(..., temp_childs_list);
temp_childs_list.clear();
}
对象在Java中作为引用传递。您始终将相同的List放入Map中,并在每次迭代后清除它。因此,Map中的每个值都指向同一个列为空的List。
你可能需要的是这样的东西:
for( ... ) {
List<String> tempChildsList = new ArrayList<>();
...
mapGroupChilds.put(..., tempChildsList);
}
因此,每次迭代都会创建一个新的List。
我也同意@CandiedOrange您的代码是一团糟,可能过于复杂。一般来说,像List和Map这样的抽象点不是通过一直计算数字索引来访问事物。
请注意,在Java中,惯例是变量的标识符是camelCase,而不是under_scored。