【问题标题】:ClassCastException: java.util.HashMap with android SimpleExpandableListAdapterClassCastException:带有 android SimpleExpandableListAdapter 的 java.util.HashMap
【发布时间】:2012-04-25 02:03:00
【问题描述】:

我正在尝试为我的移动计算课程创建一个简单的 RSS 提要阅读器应用程序。我创建了一个类来管理和保存 RSS 数据。

@SuppressWarnings("unchecked")
    SimpleExpandableListAdapter rssItemList = new SimpleExpandableListAdapter(
            this,                       // context (this class)
            createTitleList(),          // Creating group List
            R.layout.parent_row,        // Group item layout XML
            new String[]{"titles"},     // the key of group item
            new int[]{R.id.itemTitle},  // ID of each group item.-Data under the key goes into this TextView
            createChildList(),          // childData describes second-level entries
            R.layout.child_row,         // Layout for sub-level entries(second level)
            new String[]{"desc"},       // Keys in childData maps to display
            new int[]{R.id.itemDesc}    // Data under the keys above go into these TextViews
    );
    setListAdapter(rssItemList);

我的问题是显示它,我正在尝试使用 ExpandableListView,但在尝试展开列表中的项目时不断收到错误消息。

E/AndroidRuntime( 2542): FATAL EXCEPTION: main
E/AndroidRuntime( 2542): java.lang.ClassCastException: java.util.HashMap
E/AndroidRuntime( 2542):        at android.widget.SimpleExpandableListAdapter.getChildrenCount(SimpleExpandableListAdapter.java:255)
E/AndroidRuntime( 2542):        at android.widget.ExpandableListConnector.refreshExpGroupMetadataList(ExpandableListConnector.java:561)
E/AndroidRuntime( 2542):        at android.widget.ExpandableListConnector.expandGroup(ExpandableListConnector.java:682)
E/AndroidRuntime( 2542):        at android.widget.ExpandableListView.handleItemClick(ExpandableListView.java:567)
E/AndroidRuntime( 2542):        at android.widget.ExpandableListView.performItemClick(ExpandableListView.java:527)
E/AndroidRuntime( 2542):        at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
E/AndroidRuntime( 2542):        at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime( 2542):        at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime( 2542):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 2542):        at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime( 2542):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2542):        at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 2542):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime( 2542):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime( 2542):        at dalvik.system.NativeStart.main(Native Method)

我不明白为什么会出现此错误,因为我用于制作组和子列表映射的代码几乎相同。

@SuppressWarnings({ "unchecked", "rawtypes" })
private List createTitleList(){
    ArrayList itemTitles = new ArrayList();
    ArrayList<ItemData> entriesList = (ArrayList<ItemData>) feed.getMessages();

    for(int i = 0; i < entriesList.size(); i++){
        HashMap m = new HashMap();

        m.put("titles", entriesList.get(i).getTitle());

        itemTitles.add(m);
    }

    return itemTitles;
}

@SuppressWarnings({ "unchecked", "rawtypes" })
private List createChildList(){
    ArrayList itemDesc = new ArrayList(); // item description list
    ArrayList<ItemData> entriesList = (ArrayList<ItemData>) feed.getMessages();

    for(int i = 0; i < entriesList.size(); i++){
        HashMap<String, String> m = new HashMap<String, String>();

        m.put("desc", entriesList.get(i).getDescription());

        itemDesc.add(m);
    }

    return (List)itemDesc;
}

为了清楚起见,它会显示组列表,但不会展开显示子列表。

为了未来的谷歌员工的利益,我一直在使用以下教程:

Expandable ListView In Android

Expandable lists

【问题讨论】:

  • 您也应该发布引发异常的代码 sn-p,包括行号
  • 上面显示的异常发生在android系统代码中,而不是Ridkll的代码本身。

标签: java android hashmap expandablelistview classcastexception


【解决方案1】:

查看 SimpleExpandableListAdapter 的代码(我从未使用过,所以我在这里可能错了),groups 字段声明为

List<? extends Map<String, ?>> 

而孩子们应该是

List<? extends List<? extends Map<String, ?>>>

也就是说,孩子应该是地图列表的列表,而不是您似乎提供的地图列表。

我建议删除那些禁止泛型类型警告的行,并实际修复警告而不是仅仅隐藏它们。它们确实可以防止这种故障发生,而且很少有情况实际上是不可避免的。

【讨论】:

  • +1 表示不抑制警告。那只是自找麻烦。
  • 谢谢。我其实只是很困惑。拥有一个列表对我来说没有多大意义,我认为这就是我忽略这一点的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 2019-09-18
相关资源
最近更新 更多