SimpleExpandableListViewAdapter超出范围异常

时间:2014-11-28 13:05:21

标签: java android expandablelistview

经过大量的搜索和教程后,我仍然无法理解可扩展列表视图。该项目的大部分资源都包括制作自定义适配器,这对我的需求来说并不是必需的。我在资产/字符/中有一组文件夹,命名为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);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

原来我从未真正添加过childGroup。

 if (!childData.isEmpty())
            childData.add(childGroupCurrent);

转向:

if (!childGroupCurrent.isEmpty())
    childData.add(childGroupCurrent);

修正了它。