ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java.lang.String无法强制转换为com.example.expandablelistview.NewsItem

2019-05-29 10:14:55  阅读:252  来源: 互联网

标签:java android hashmap sharedpreferences expandablelistview


我正在尝试将expandablelistview子数据保存到SharedPreferences.保存正在运行,但是当我尝试加载它时,我得到错误.

问题:

当试图加载设置并将其放入HashMap时,我得到这些错误(简称为3行):

08-24 12:40:05.138: E/AndroidRuntime(807): FATAL EXCEPTION: main
08-24 12:40:05.138: E/AndroidRuntime(807): java.lang.ClassCastException: java.lang.String cannot be cast to com.example.expandablelistview.NewsItem
08-24 12:40:05.138: E/AndroidRuntime(807):  at com.example.expandablelistview.ExpandableListAdapter.getChildView(ExpandableListAdapter.java:62)

为了保存数据,我将使用以下代码:

    SharedPreferences pref = context.getSharedPreferences("myPrefs", MODE_PRIVATE);
    SharedPreferences.Editor editor= pref.edit();

    for( Entry<String, List<NewsItem>> entry : listDataChild.entrySet() )  {
          editor.putString( entry.getKey(), String.valueOf(entry.getValue())); // Save the values of listDataChild
    }

    editor.commit();

数据的输出是:

Yesterday: [[ headline=51.17346, 3.2252, Speed=2.10KM/H, Direction=158, date=18-8-2013 13:37:32]]
Older: [[ headline=51.74346, 3.23252, Speed=2.00KM/H, Direction=122, date=17-8-2013 11:40:30]]
Today: [[ headline=51.07346, 3.35252, Speed=0.00KM/H, Direction=122, date=19-8-2013 18:50:42]]

当试图加载这些数据(这里发生的错误)并将其放入HashMap时,我将使用它(from here):

    for( Entry<String, ?> entry : pref.getAll().entrySet() ) {
        listDataChild.put( entry.getKey(), (List<NewsItem>) Arrays.asList(entry.getValue()) ); // Put it in listDataChild
    }

数据的初始化发生在这里:

static void prepareListData(final Context context) {
    listDataHeader = new ArrayList<String>();
    listDataChild = new HashMap<String, List<NewsItem>>();

    // Adding child data
    listDataHeader.add("Today");
    listDataHeader.add("Yesterday");
    listDataHeader.add("Older");
    List<NewsItem> today = new ArrayList<NewsItem>();
    NewsItem newsData = new NewsItem();
    newsData.setHeadline("51.07346, 3.35252");
    newsData.setSpeed("0.00KM/H");
    newsData.setDirection("122");
    newsData.setDate("19-8-2013 18:50:42");
    today.add(newsData);

    List<NewsItem> yesterday = new ArrayList<NewsItem>();
    newsData = new NewsItem();
    newsData.setHeadline("51.17346, 3.2252");
    newsData.setSpeed("2.10KM/H");
    newsData.setDirection("158");
    newsData.setDate("18-8-2013 13:37:32");
    yesterday.add(newsData);

    List<NewsItem> older = new ArrayList<NewsItem>();
    newsData = new NewsItem();
    newsData.setHeadline("51.74346, 3.23252");
    newsData.setSpeed("2.00KM/H");
    newsData.setDirection("122");
    newsData.setDate("17-8-2013 11:40:30");
    older.add(newsData);

    listDataChild.put(listDataHeader.get(0), today);
    listDataChild.put(listDataHeader.get(1), yesterday);
    listDataChild.put(listDataHeader.get(2), older);
}

试过尝试:

我试图更改listdataChild.put以将数据加载到此:

listDataChild.put( entry.getKey(), new ArrayList<NewsItem>((Collection<? extends NewsItem>) Arrays.asList(entry.getValue())) );

对此:

listDataChild.put( entry.getKey(), (List<NewsItem>) new ArrayList(Arrays.asList(entry.getValue())) );

但没有任何结果. (我有同样的错误)

题:

是否可以将映射值转换为列表并将其放入HashMap listDataChild中?

或者我应该使用newsData.setHeadline(“Value”);, newsData.setSpeed(“Value”);等等.? (我不知道如何获取SharedPreferences列表中的特定值)

(NewsItem.java的源代码可以在here找到,ExpandableListAdapter.java的源代码可以在here找到,MainActivity.java的源代码可以在here找到)

解决方法:

正如其他人已经指出的那样,仅仅使用Arrays.asList()和强制转换到数据列表的期望是不正确的,并且不起作用.当您使用SharedPreferences.Editor.putString()时,您将在首选项中插入一个String,表示List.toString()返回的字符串(它将在方括号中打印其所有子项(使用toString())).当您从首选项中获取此字符串时,需要将其构建到NewsItems列表中.如何做到这一点的一种方法如下:

for (Entry<String, ?> entry : pref.getAll().entrySet()) {
                    List<NewsItem> rowItems = new ArrayList<NewsItem>();
                    // the string from the preferences as it was saved
                    String prefContent = (String) entry.getValue();
                    // break against possible multiple NewsItems(I'm assuming that's 
                    // why you use a List of NewsItems) for the same
                    // key (every NewsItem starts with * so we split after
                    // that(see the NewsItems.toString method))
                    String[] newsItems = prefContent.split("\\*");
                    for (String item : newsItems) {
                        // an item which doesn't have at least 50 characters
                        // isn't a valid NewsItem string representation(based on
                        // its toString() method)
                        if (item.length() > 50) {
                            // ; is the delimiter for the NewsItem's data
                            String[] components = item.split(";");
                            NewsItem ni = new NewsItem();
                            // for each of the four data components we split
                            // after = and then use the second value obtained as
                            // that will be the value for that component
                            ni.setHeadline((components[0].split("="))[1]);
                            ni.setSpeed((components[1].split("="))[1]);
                            ni.setDirection((components[2].split("="))[1]);
                            ni.setDate((components[3].split("="))[1]);
                            rowItems.add(ni);
                        }
                    }
                    listDataChild.put(entry.getKey(), rowItems);
                }

上面的代码需要更改NewsItem类的toString()方法:

@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("*headline=");
    sb.append(headline);
    sb.append(";");
    sb.append("speed=");
    sb.append(speed);
    sb.append(";");
    sb.append("direction=");
    sb.append(direction);
    sb.append(";");
    sb.append("date=");
    sb.append(date);
    return sb.toString();
}

标签:java,android,hashmap,sharedpreferences,expandablelistview
来源: https://codeday.me/bug/20190529/1177026.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有