Android Hashmap no pudo aparecer dentro de listView

Estoy atascado en este problema de hashmap al copiar la clave. (Androide)

Inicialmente tenía un archivo xml similar a este

<many_people>
  <people>
    <id>1</id>
     <name>Johnson</name>
     <tel_num>12345678</tel_num>
  </people>
     .
     .
     .
</many_people>

así que creé arraylist con hashmap para almacenar todo el xml

for (int i = 0; i < nl.getLength(); i++) {
        map = new HashMap<String, String>();
        Element e = (Element) nl.item(i);
        map.put(KEY_ID, parser.getValue(e, KEY_ID));
        map.put(KEY_NAME, parser.getValue(e, KEY_NAME));
        map.put(KEY_TELNUM, parser.getValue(e, KEY_TELNUM));

        // adding HashList to ArrayList
        peopleList.add(map);
    }

Usé onItemClickListener para capturar la entrada de AutoCompleteTextView para poder comparar la entrada con el xml. La lista de personas se usará más adelante en listView.

Por ejemplo: input - Johnson Compare with , si se encuentra, mi vista de lista mostrará el nombre de Johnson con el contacto juntos. El problema está aquí, si tengo 2 Johnson, listView solo lee mi primer johnson en el xml. No sé cómo comparar la entrada con el xml. A continuación se muestra mi código:

for (HashMap<String, String> map : peopleList) {
  if (input.equals(map.get(KEY_NAME))) {
      // At here I created another hashmap with copying the value
      map2.put(KEY_ID, map.get(KEY_ID));
      map2.put(KEY_NAME, map.get(KEY_NAME));
      map2.put(KEY_NAME, map.get(KEY_TELNUM));
      peopleList2.add(map2);
    }
}    

Logré mostrar con éxito los primeros datos en mi vista de lista, pero fallaron los datos segundo y tercero (el mismo nombre que Johnson). No estoy seguro de que esta sea la forma de hacerlo o no.

preguntado el 23 de diciembre de 12 a las 20:12

2 Respuestas

Aquí adentro:

for (HashMap<String, String> map : peopleList) {
  if (input.equals(map.get(KEY_NAME))) {
      // At here I created another hashmap with copying the value
      map2.put(KEY_ID, map.get(KEY_ID));
      map2.put(KEY_NAME, map.get(KEY_NAME));
      map2.put(KEY_NAME, map.get(KEY_TELNUM));
      peopleList2.add(map2);
    }
}    

Aquí creé otro mapa hash copiando el valor

Bueno, si ese es todo tu código de bucle FOR, definitivamente no creaste una alternativa, mapa. Solo está actualizando el mismo HashMap (map2) una y otra vez y agregarlo a la lista. Como está utilizando el mismo HashMap, simplemente actualizará el mismo objeto una y otra vez, terminando con N (la cantidad de coincidencias) referencias a la misma "persona".

Como dijo Michael, no hay razón para esto, debe crear una clase Person.

Respondido el 23 de diciembre de 12 a las 21:12

Ah, de alguna manera, me perdí por completo la parte en la que estaba rehaciendo completamente el mapa en cada iteración del primer ciclo for ... edité mi respuesta y voté a favor de la nuestra. - Michael

Si dos valores con el mismo key se ponen en un HashMap, el primero se sobrescribe con el segundo. Debe asegurarse de que cada 'persona' que ingrese sea única, de modo que no sobrescriba a una persona anterior. (Nota: Esto es cierto, pero no es tu problema)

Sugerencia: Crea un Person objeto, introduciendo los datos de cada persona en este nuevo objeto. Luego inserte Person en su hashmap. Recuerda implementar el equals y hashCode funciones para su nuevo objeto para que se ingrese de manera eficiente en el mapa.

Editar: leí mal tu código original. Hay problemas mucho peores. Como dijo dmon, ¿por qué crearía un nuevo hashmap para cada ciclo a través del ciclo for y luego almacenaría solo 4 cosas en él? Esto es increíblemente ineficiente, y deberías deshacerte del hashmap por completo. Almacenar el Person clase en su lista en lugar de un hashmap para cada persona...

Respondido el 23 de diciembre de 12 a las 21:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.