Android Hashmap no pudo aparecer dentro de listView
Frecuentes
Visto 83 equipos
0
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.
2 Respuestas
1
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
1
Si dos valores con el mismo (Nota: Esto es cierto, pero no es tu problema)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.
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 java android or haz tu propia pregunta.
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