Java.lang.String no se puede convertir en com.example.expandablelistview.NewsItem
Estoy tratando de guardar los datos de los niños expandiblelistview a SharedPreferences
. El ahorro está trabajando pero cuando intento cargarlo entonces consigo errores.
Problema:
- Cómo almacenar objeto de clase en android sharedPreference?
- ¿Cómo iterar a través de todas las claves de las preferencias compartidas?
- Android: copiar / duplicar las preferencias compartidas
- Android: haz algo en actividad cuando cambian las preferencias
- Escritura de clase Singleton para administrar las compartidas SharedPreferences de Android
Al intentar cargar los ajustes y ponerlo en un HashMap consigo estos errores (cortocircuito a 3 líneas):
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)
Para guardar los datos utilizaré este código:
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();
La salida de los datos es:
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]]
Al intentar cargar estos datos (los errores ocurrieron aquí) y ponerlo en un HashMap usaré esto ( de aquí ):
for( Entry<String, ?> entry : pref.getAll().entrySet() ) { listDataChild.put( entry.getKey(), (List<NewsItem>) Arrays.asList(entry.getValue()) ); // Put it in listDataChild }
La inicialización de los datos es aquí:
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); }
Intentos intentados:
He intentado cambiar el listdataChild.put
para cargar los datos a esto:
listDataChild.put( entry.getKey(), new ArrayList<NewsItem>((Collection<? extends NewsItem>) Arrays.asList(entry.getValue())) );
Y a esto:
listDataChild.put( entry.getKey(), (List<NewsItem>) new ArrayList(Arrays.asList(entry.getValue())) );
Pero sin resultados. (Tengo el mismo error)
Pregunta:
¿Es posible convertir los valores del mapa a la lista y ponerlo en el HashMap listDataChild
?
¿O debo usar newsData.setHeadline("Value");
, newsData.setSpeed("Value");
Etc (No sé cómo obtener valores específicos que están en la lista SharedPreferences
)
(La fuente de NewsItem.java
se puede encontrar aquí , la fuente de ExpandableListAdapter.java
se puede encontrar aquí , y la fuente de MainActivity.java
se puede encontrar aquí )
- Guardar SharedPreferences archivos en directorio personalizado o obtener predeterminado SharedPreferences dir
- ¿Dónde se almacenan las preferencias compartidas?
- Comportamiento SharedPreferences en Actualizar / Desinstalar
- ¿Cómo puedo ver el archivo de preferencias compartidas con Android Studio?
- Eliminación de preferencias compartidas
- Cómo poner / obtener varios JSONObjects a JSONArray?
- Android - ¿Es mala práctica tener múltiples preferencias compartidas?
- Samsung y Android 2.2.1 compartido pref cuestión
Como otros ya han señalado, las expectativas de simplemente usar Arrays.asList()
y el casting a su lista de datos es incorrecta y no funcionará. Cuando use SharedPreferences.Editor.putString()
, insertará una String
en las preferencias que representan la cadena devuelta por List.toString()
(que imprimirá a todos sus hijos (usando toString()
) entre corchetes). Cuando obtenga esta cadena de las preferencias de nuevo, debe NewsItems
en una List
de NewsItems
de NewsItems
. Una forma de cómo puede hacer esto sería como a continuación:
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); }
El código anterior requeriría un cambio en el método toString()
de la clase 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(); }
Necesitas convertir la String
que recibes de SharedPreferences
alguna manera a una lista de NewsItem
. Un reparto solo no hará eso.
Esta excepción significa que está intentando asignar un objeto String a una variable de referencia com.example.expandablelistview.NewsItem
Sé que esto no ayuda mucho, pero de cualquier manera
No estoy seguro acerca de –
¿Es posible convertir los valores del mapa a la lista y ponerlo en el HashMap listDataChild?
Como usted está buscando para guardar los datos POJO en pref compartido. Puede utilizar el formato JSON para serializar su NewsItemList y los objetos que contiene y, a continuación, almacenar es como una cadena en SharedPreferences. Google-JSON es un buen api para esto.
Cuando quiera recuperar los datos, recupere la cadena y utilice un JSONArray para recuperar cada objeto y agregarlo a una nueva NewsItemList.
De lo contrario, intente serializar su objeto en un archivo privado . Esto te ayudará a ir más allá de putString (), putFloat (), putLong (), putInt () y putBoolean () de SharedPreferences. Gracias.
- Falta el muestreo de la suscripción JSON parsing de purchaseToken
- Gridview, permite que el lienzo de fondo dibuje fuera de la vista