我試圖將expandablelistview子數據保存到SharedPreferences
。保存正在工作,但是當我嘗試加載它時,我得到錯誤。java.lang.String不能轉換爲com.example.expandablelistview.NewsItem
問題:
當試圖加載設置,並把它放在一個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
}
數據的初始化在這裏happend:
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)
我很肯定你鏈接到*的'ExpandableListAdapter'的版本不是你正在使用的版本,因爲對於'NewsItem'的轉換髮生在62行,而不是66: –
@JonSkeet Woops,我已經在上傳之前刪除了幾行,現在確實已經在第62行。謝謝你的注意。:) – user1480019
這對你沒有顯示你在初始化'ExpandableListAdapter'的位置沒有幫助。 –