[ Foro de Java ]

Al recorrer un Array solo obtengo el último valor.

14-Aug-2018 20:29
Joaquín López
2 Respuestas

Tengo un método en el que va el siguiente bucle:
for (int i=0; i<geofenceTransitionDetails.length; i++) {    
    enviarDatos(geofenceTransitionDetails[i]);
}

El método enviarDatos es el siguiente:
private void enviarDatos(String nombreNoti) {

   ArrayList<String> sortedKeys = new ArrayList<String>(TITULO_LANDMARKS.keySet());

   for(int x=0;x<sortedKeys.size();x++) {
       if(sortedKeys.get(x).equals(nombreNoti)) {
           titulo=TITULO_LANDMARKS.get(sortedKeys.get(x).);
break;
       }

   }

   sendNotification(nombreNoti,titulo);
}
En él comparo las claves de un HashMap (TITULO_LANDMARKS)con el String  nombreNoti y si coinciden obtengo el valor del HashMap (titulo).
Una vez obtenido lo envío al método sendNotification. Que consiste en lo siguiente:
private void sendNotification(String nombreNotification, String tituloPasado) {

...
.setContentTitle(nombreNotification)
.setContentText(tituloPasado)
...

El problema surge cuando ejecuto el código y recibo la notificación (pues de una notificación de Android se trata), .setContentTitle(nombreNotification)lo recibo correctamente, serían (tres notificaciones en mi prueba):

Tapas y comida rápida El Puchero
Alojamiento Alexis
Alojamiento Alonso de Ojeda

El problema surge con .setContentText(tituloPasado)en el que recibo siempre el mismo valor: "Habitación doble 30 €" que corresponde en la base de datos al último valor (Alojamiento Alonso de Ojeda), quedando de la siguiente manera:

Tapas y comida rápida El Puchero
Habitación doble 30 €

Alojamiento Alexis
Habitación doble 30 €

Alojamiento Alonso de Ojeda
Habitación doble 30 €

Con lo que el problema debe estar en el bucle for de enviarDatos. Por muchas vueltas que le he dado no consigo solucionarlo, así que si alguien pudiera orientarme se lo agradecería mucho.


27-Aug-2018 12:29
Nacho Cabanes (+83)

Con sólo fragmentos de código aislados es difícil ver el problema. Lo ideal sería que intentaras extraerlo al menor programa completo capaz de mostrar el error.

En cualquier caso, tu "for" parece recorrer todos los datos. ¿El problema no puede ser que el "if" que hay dentro de ese "for" esté limitando los datos demasiado?


28-Aug-2018 10:35
Joaquín López

Lo primero gracias por tu respuesta y tu tiempo.
Lo segundo es que está solucionado,  al depurar he visto lo siguiente:
List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences();
String geofenceTransitionDetails1 = getGeofenceTransitionDetails(geofenceTransition, triggeringGeofences);
//String[] geofenceTransitionDetails = geofenceTransitionDetails1.split(",");
String[] geofenceTransitionDetails = geofenceTransitionDetails1.split("\\s*,\\s*");


for (int i=0; i<geofenceTransitionDetails.length; i++) {
   enviarDatos(geofenceTransitionDetails[i]);
}
private void enviarDatos(String nombreNoti) {
   for(int x=0;x<sortedKeys.size();x++) {
       if((sortedKeys.get(x)).equals(nombreNoti)) {
           ti tulo=TITULO_LANDMARKS.get(sortedKeys.get(x));
           break;
       }
   }
El problema estaba en la igualdad sortedKeys.get(x)).equals(nombreNoti) que solo se cumplía para el primer elemento  del array String[] geofenceTransitionDetails y luego dejaba de cumplirse para los demás. Esto era debido por lo que he visto en el debug a que el primer elemento del bucle era por ejemplo:
sortedKeys.get(x) = "Tapas y comida rápida El Puchero". Y
nombreNoti = "Tapas y comida rápida El Puchero"
Pero en el segundo:
sortedKeys.get(x) = "Alojamiento Alexis". Y
nombreNoti = " Alojamiento Alexis". Nota que hay un espacio detrás de las primeras comillas. Esto es debido a que tenía puesto:
[] geofenceTransitionDetails = geofenceTransitionDetails1.split(",");
que dejaba ese espacio entre la coma del primer elemento y el segundo con lo que no se cumplía la igualdad. Así que he eliminado los espacios de la siguiente manera:
String[] geofenceTransitionDetails = geofenceTransitionDetails1.split("\\s*,\\s*");
Gracias otra vez.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)