Cómo puede emitir un HashMap anidado en un ArrayList
Hay una ArrayList que ha anidado HashMaps. Es fácil obtener el valor de la HashMap padre, pero cuando intento obtener el valor de la HashMap anidada (child), obtengo ClassCastException. Este es un ejemplo de cómo se ve (similar a la publicación anterior):
ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>(); HashMap<String, Object> parentHash = new HashMap<String, Object>(); HashMap<String, String> childHash = new HashMap<String, String>(); childHash.put("child_id", "id") childHash.put("name", "first last"); childHash.put("sex", "man"); parentHash.put("parent_id", "id"); parentHash.put("name", "first last"); parentHash.put("sex", "woman"); parentHash.put("children", childHash); data.add(parentHash);
Para emitir, utilizo el siguiente código (por desgracia, obtengo ClassCastException):
- Obtención del contexto de la actividad en un android de clase de no actividad
- Android Dex: la opción "--core-library" para suprimir este mensaje de error
- react-native run-android falló con error: Error de ejecución para la tarea ': app: dexDebug'
- Qué hace que el método OnDraw de View se llame y cuando
- Lectura de un archivo XML desde recursos
Map<String, String> fetchedChildData = (Map<String, String>) data.get(position).get("children"); showAlert("Test", "Ok", (String) fetchedChildData.get("child_id"));
¿Puede alguien decirme lo que estoy haciendo mal aquí?
Errorlist:
04-03 17:34:01.640: W/dalvikvm(26248): threadid=1: thread exiting with uncaught exception (group=0x4001e578) 04-03 17:34:01.645: E/AndroidRuntime(26248): FATAL EXCEPTION: main 04-03 17:34:01.645: E/AndroidRuntime(26248): java.lang.ClassCastException: java.util.ArrayList 04-03 17:34:01.645: E/AndroidRuntime(26248): at com.on_d_mand.live_dashboard.EventListMenu$2.onItemClick(EventListMenu.java:265) 04-03 17:34:01.645: E/AndroidRuntime(26248): at android.widget.AdapterView.performItemClick(AdapterView.java:284) 04-03 17:34:01.645: E/AndroidRuntime(26248): at android.widget.ListView.performItemClick(ListView.java:3740) 04-03 17:34:01.645: E/AndroidRuntime(26248): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1992) 04-03 17:34:01.645: E/AndroidRuntime(26248): at android.os.Handler.handleCallback(Handler.java:587) 04-03 17:34:01.645: E/AndroidRuntime(26248): at android.os.Handler.dispatchMessage(Handler.java:92) 04-03 17:34:01.645: E/AndroidRuntime(26248): at android.os.Looper.loop(Looper.java:130) 04-03 17:34:01.645: E/AndroidRuntime(26248): at android.app.ActivityThread.main(ActivityThread.java:3691) 04-03 17:34:01.645: E/AndroidRuntime(26248): at java.lang.reflect.Method.invokeNative(Native Method) 04-03 17:34:01.645: E/AndroidRuntime(26248): at java.lang.reflect.Method.invoke(Method.java:507) 04-03 17:34:01.645: E/AndroidRuntime(26248): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) 04-03 17:34:01.645: E/AndroidRuntime(26248): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670) 04-03 17:34:01.645: E/AndroidRuntime(26248): at dalvik.system.NativeStart.main(Native Method)
- Mensaje de Android entre clases
- Diferencia, en minutos, entre dos fechas
- Obteniendo clase por su nombre
- Java.lang.IllegalStateException: Se esperaba BEGIN_ARRAY pero era BEGIN_OBJECT en la línea 1 de la columna 2
- AudioManager enviar mensaje a un manejador en un hilo muerto?
- Google Maps V2 - Android - Obtener el nivel de zoom actual
- Capturar captura de pantalla de Android con appium
- Llamada Hilo principal de hilo secundario en Java / Android
Los objetos JSON que se representan como un "mapa" o "diccionario" no significan que usted debe representarlo igualmente en Java. ¡Los objetos están allí para este propósito!
Le sugiero que tenga un objeto que analizará el JSON asociado y se construirá a partir de él. Por ejemplo:
public class User { public User() { name = ""; friends = new ArrayList<User>(); } /** Create a User from a JSON Object **/ public static User createFromJson(JSONObject json) { User u = new User(); // Read simple fields of the JSON object u.name = json.optString("name"); // Now recursively read other users from a "friend" property JSONArray jsonFriends = json.optJSONArray("friends"); for (int i=0; i<jsonFriends.length(); ++i) { // This is the next nested JSON Object JSONObject jsonFriend = jsonFriends.getJSONObject(i); // We convert it to a Java object User friend = User.createFromJson(jsonFriend); // And add it to our friend list u.friends.add(friend); } } private String name; private List<User> friends; }
Esa clase leería muy bien un JSON tal como:
{ "name": "Joe", "friends": [ { "name": "Jack" }, { "name": "Rose" } ] }
Su código funciona bien para mí en Java 6. Tal vez sea un error con Android Dalvik?
De todos modos, estoy de acuerdo en que deberías considerar crear tus propias clases ("Parent", "Child", etc) y usar el patrón de diseño compuesto , en lugar de usar colecciones dentro de colecciones dentro de colecciones.
ArrayList<HashMap<String,Object>> data = new ArrayList<HashMap<String,Object>>(); HashMap<String, Object> parentHash = new HashMap<String, Object>(); HashMap<String, String> childHash = new HashMap<String, String>(); childHash.put("child_id", "id"); childHash.put("name", "first last"); childHash.put("sex", "man"); parentHash.put("parent_id", "id"); parentHash.put("name", "first last"); parentHash.put("sex", "woman"); parentHash.put("children", childHash); data.add(parentHash); Map<String, String> fetchedChildData = (Map<String, String>) data.get(0).get("children"); // prints: child_id=id System.out.println("child_id=" + fetchedChildData.get("child_id"));
Esto debería funcionar:
int position = 0; Map<String, Object> parent = data.get(position); Map<String, String> child = (Map<String, String>) parent.get("children");
- ¿Por qué XML no HTML se utiliza para la interfaz de usuario en Android progrmming?
- Uso de vlclib en Android