Java.lang.String не может быть добавлен в com.example.expandablelistview.NewsItem

Я пытаюсь сохранить дочерние данные SharedPreferences в SharedPreferences . Сохранение работает, но когда я пытаюсь загрузить его, я получаю ошибки.

Проблема:

При попытке загрузить настройки и поместить их в HashMap я получаю эти ошибки (shorted to 3 lines):

 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, я буду использовать это ( отсюда ):

  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())) ); 

Но без каких-либо результатов. (У меня такая же ошибка)

Вопрос:

Можно ли преобразовать значения карты в список и поместить в список listDataChild ?

Или мне следует использовать newsData.setHeadline("Value"); , newsData.setSpeed("Value"); и т.д.? (Я не знаю, как получить определенные значения, которые SharedPreferences списке SharedPreferences )

(Источник NewsItem.java можно найти здесь , источник ExpandableListAdapter.java можно найти здесь , а источник MainActivity.java можно найти здесь )

Как уже отмечали другие, ожидания просто использования Arrays.asList() и внесения в ваш список данных неверны и не будут работать. Когда вы используете SharedPreferences.Editor.putString() вы вставляете String в предпочтения, представляющие строку, возвращаемую List.toString() (которая будет печатать все свои дочерние List.toString() (используя toString() ) в квадратных скобках). Когда вы вернете эту строку из настроек, вам нужно создать ее в List of 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); } 

Приведенный выше код потребует изменения метода toString() класса NewsItem :

 @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(); } 

Вам нужно преобразовать String вы возвращаете из SharedPreferences так или иначе в список NewsItem . Только прилив не сделает этого.

Эти исключения означают, что вы пытаетесь присвоить объект String переменной com.example.expandablelistview.NewsItem

Я знаю, что это не помогает, но в любом случае

Я не уверен в этом –

Можно ли преобразовать значения карты в список и поместить в список HashMapDataChild?

Поскольку вы хотите сохранить данные POJO в общих привилегиях. Вы можете использовать формат JSON для сериализации вашего NewsItemList и объектов, которые он содержит, а затем сохранить как строку в SharedPreferences. Google-JSON – хороший пример для этого.

Когда вы хотите вернуть данные, извлеките String и используйте JSONArray для извлечения каждого объекта и добавления его в новый NewsItemList.

В противном случае попробуйте выполнить сериализацию вашего объекта в приватном файле . Это поможет вам выйти за рамки putString (), putFloat (), putLong (), putInt () и putBoolean () для SharedPreferences. Спасибо.

Intereting Posts
Возможно ли создать программу просмотра PDF в Android? Как использовать действия или фрагменты в многоэкранном рабочем процессе? Требуется ли учетная запись Google для GCM (Google Cloud Messaging)? Android Seekbar – разрешить изменение с помощью большого пальца? Вход в Facebook не работает, когда я использую Samsung Android 4.2 Почему класс ImageView не найден? ViewPager внутри ScrollView – вертикальная прокрутка не работает Поиск в реальном времени устройства Android с другого устройства Когда Fragment.instantiate предпочтительнее MyFragment.newInstance или нового MyFragment () Не удалось получить доступ к jarfile lib \ archquery.jar Viewpager не обертывает содержимое после загрузки изображений из Интернета Как управлять базой данных с 400 000 записей в iPhone и Android? Нужна программа-пример «Сохранение файлов кэша» в Android Просмотр не привязан к краху оконного менеджера Flash Builder встраивает файлы в приложение, например flash IDE?