经过大量的搜索和教程后,我仍然无法理解可扩展列表视图。该项目的大部分资源都包括制作自定义适配器,这对我的需求来说并不是必需的。我在资产/字符/中有一组文件夹,命名为a-row,ka-row,a-row-katakana,ka-row-katakana等。它们被添加到TreeMap中,然后将其添加到列表视图中根据他们的头衔。
标题的格式如下:Hiragana~A-row
并由~
分割。分割中的第一个,Hiragana
是类别,A-row
是项目的标题。然而,片假名项目(现在只有两个)错误地出现在平假名类别中,当我扩展片假名类别时,我得到例外。
这是一段视频演示: https://mediacru.sh/Gb59fW-FpOJY
最后,这是在尝试打开片假名类别后收到的错误:
11-28 13:01:01.736 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at java.util.ArrayList.get(ArrayList.java:308)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at android.widget.SimpleExpandableListAdapter.getChildrenCount(SimpleExpandableListAdapter.java:255)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at android.widget.ExpandableListConnector.refreshExpGroupMetadataList(ExpandableListConnector.java:567)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at android.widget.ExpandableListConnector.expandGroup(ExpandableListConnector.java:698)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at android.widget.ExpandableListView.handleItemClick(ExpandableListView.java:698)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at android.widget.ExpandableListView.performItemClick(ExpandableListView.java:651)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at android.widget.AbsListView$PerformClick.run(AbsListView.java:3467)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at android.widget.AbsListView$3.run(AbsListView.java:4830)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:733)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at android.os.Looper.loop(Looper.java:146)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5602)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
11-28 13:01:01.741 31037-31037/com.lemonlake.japanesehandwriting W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
我的代码:
List<Map<String, String>> groupData = new ArrayList<Map<String, String>>();
List<List<Map<String, String>>> childData = new ArrayList<List<Map<String, String>>>();
List<Map<String, String>> childGroupCurrent = new ArrayList<Map<String, String>>();
for (Map.Entry<String, String> entry : mDictionaryFolders.entrySet()) {
final String key = entry.getKey();
final String value = entry.getValue();
final String[] split = key.split("~");
Map<String, String> category = new HashMap<String, String>() {{
put("ROOT_NAME", split[0]);
}};
if (!groupData.contains(category)) {
groupData.add(category);
if (!childData.isEmpty())
childData.add(childGroupCurrent);
childGroupCurrent = new ArrayList<Map<String, String>>();
}
childGroupCurrent.add(new HashMap<String, String>() {{
put("CHILD_NAME", split[1]);
put("FILE_NAME", value);
}});
}
childData.add(childGroupCurrent);
ExpandableListView mKanjiListView = (ExpandableListView) findViewById(R.id.dictionariesListView);
mKanjiListAdapter = new SimpleExpandableListAdapter(
Main.this,
groupData,
R.layout.expandable_list_item_1,
new String[]{"ROOT_NAME"},
new int[]{android.R.id.text1},
childData,
R.layout.expandable_list_item_2,
new String[]{"CHILD_NAME"},
new int[]{android.R.id.text1}
);
mKanjiListView.setAdapter(mKanjiListAdapter);
mKanjiListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
HashMap<String, String> child = (HashMap<String, String>) mKanjiListAdapter.getChild(groupPosition, childPosition);
Intent intent = new Intent(Main.this, HandwritingActivity.class);
intent.putExtra("fileToOpen", child.get("FILE_NAME") + "/chars.dat");
startActivity(intent);
return true;
}
});
供参考,这是字典所在的方法: String fileList [] = getAssets()。list(&#34; characters&#34;);
for (String aFileList : fileList) {
if (!aFileList.contains(".")) {
String fileList2[] = getAssets().list("characters/" + aFileList);
for (String aFileList2 : fileList2) {
if (aFileList2.toLowerCase().contains("chars.dat")) {
System.out.println("Dictionary file: " + aFileList + "/" + aFileList2);
String title = "";
try {
InputStream in = getAssets().open("characters/" + aFileList + "/" + aFileList2);
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
title = reader.readLine();
reader.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
mDictionaryFolders.put(title, "characters/" + aFileList);
}
}
}
}
答案 0 :(得分:1)
原来我从未真正添加过childGroup。
if (!childData.isEmpty())
childData.add(childGroupCurrent);
转向:
if (!childGroupCurrent.isEmpty())
childData.add(childGroupCurrent);
修正了它。