Foros del Web » Programando para Internet » Android »

Problema con ArrayList, al llenarlo

Estas en el tema de Problema con ArrayList, al llenarlo en el foro de Android en Foros del Web. Hola, Intento llenar un ArrayList con los datos que voy recuperando al leer una carpeta de una cuenta de gmail pero no lo consigo. Los ...
  #1 (permalink)  
Antiguo 24/10/2011, 15:50
Avatar de javih  
Fecha de Ingreso: agosto-2011
Mensajes: 201
Antigüedad: 13 años, 3 meses
Puntos: 12
Problema con ArrayList, al llenarlo

Hola,

Intento llenar un ArrayList con los datos que voy recuperando al leer una carpeta de una cuenta de gmail pero no lo consigo. Los datos se recuperan porque se pueden ver si los imprimo por el logcat con Log.d y también los puedo ver depurando.

Pero parece que estos datos no están llegando a la Activity o en la Activity tengo mal definido el arraylist, no lo sé.

Pongo el código a ver si me pueden decir:

Esto en la Activity:

Código:
ArrayAdapter<Recibidos> adaptador;
	List<Recibidos> modelo = new ArrayList<Recibidos>();
		
	
	public static class Recibidos {
		public static String _correo = "";
		public static void set_correo(String _correo) {
			Recibidos._correo = _correo;
		}
		public static String _asunto = "";
		public static void set_asunto(String _asunto) {
			Recibidos._asunto = _asunto;
		}
		}
	}
Y luego en la clase java que utilizo para las operaciones con el mail:

Código:
//Determinar el tipo de email
				if (_messagecontentObject instanceof Multipart) {
					Log.d(logTag, "Encontrado email con adjunto");
					_emisor = ((InternetAddress) _message.getFrom()[0]).getPersonal();
					Recibidos.set_correo(_emisor);
															
					if (_emisor == null) {
						_emisor = ((InternetAddress) _message.getFrom()[0]).getAddress();
						
					}
					Log.d(logTag, "Emisor -. " + _emisor);
					
					_asunto = _message.getSubject();
					Recibidos.set_asunto(_asunto);
					Log.d(logTag, "Asunto= " + _asunto);

					_multipart = (Multipart) _message.getContent();
					Recibidos.set_body(_message.getContent().toString());
Y por último el ArrayAdapter que lo tengo en el onCreate:

Código:
adaptador = new ArrayAdapter<InBoxActivity.Recibidos>(getApplicationContext(), android.R.layout.simple_list_item_1, modelo);
			lvInbox.setAdapter(adaptador);
Saludos
  #2 (permalink)  
Antiguo 24/10/2011, 18:17
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Problema con ArrayList, al llenarlo

Hola,

Posiblemente,

Cita:
Iniciado por javih Ver Mensaje
Código:
public static class Recibidos {
¿Algún motivo en especial por el cual deba ser 'static'?

Cita:
Iniciado por javih Ver Mensaje
Intento llenar un ArrayList con los datos que voy recuperando al leer una carpeta de una cuenta de gmail pero no lo consigo.
Cuando una clase es estática solamente se puede crear una instancia de la misma, por lo tanto siempre que hagas una nueva instancia de la clase siempre se va a referir al mismo objeto, es decir el último mensaje.

Cita:
Iniciado por javih Ver Mensaje
Código:
Recibidos.set_correo(_emisor);
Recibidos.set_asunto(_asunto);
Recibidos.set_body(_message.getContent().toString());
¿En algún momento agregas el objeto 'Recibidos' al ArrayList?

Código Java:
Ver original
  1. Recibidos r = new Recibidos();
  2. r.set_asunto("Hola");
  3. r.set_correo("Mundo");
  4. modelo.add(r);

Según la nomeclatura de Java es preferible hacerlo así:

Código Java:
Ver original
  1. public class Recibidos {
  2.     public String correo = "";
  3.     public String asunto = "";
  4.     public void setCorreo(String correo) {
  5.         this.correo = correo;
  6.     }
  7.     public void setAsunto(String asunto) {
  8.         this.asunto = asunto;
  9.     }
  10.     @Override
  11.     public String toString() {
  12.         return this.correo.concat(this.asunto);
  13.     }
  14. }

Saludos,
  #3 (permalink)  
Antiguo 24/10/2011, 19:12
Avatar de javih  
Fecha de Ingreso: agosto-2011
Mensajes: 201
Antigüedad: 13 años, 3 meses
Puntos: 12
Respuesta: Problema con ArrayList, al llenarlo

Eso era lo que se me había pasado, agregar el objeto Recibidos al ArrayList .

Pruebo y ya comento.

Muchas gracias
  #4 (permalink)  
Antiguo 24/10/2011, 20:12
Avatar de javih  
Fecha de Ingreso: agosto-2011
Mensajes: 201
Antigüedad: 13 años, 3 meses
Puntos: 12
Respuesta: Problema con ArrayList, al llenarlo

Lo de static era porque tenía una clase en otro archivo fuera de la activity pero ahora lo he metido dentro de la activity y eliminado lo de static y corregido a como dice la nomenclatura de Java.

Ahora funciona hasta ahí, hasta el objeto Recibidos pero no llena el ArrayList ni establece el adapter ni nada.

Código:
private ArrayList<Recibidos> data;
	private ArrayAdapter<Recibidos> adaptador;
	
	/**
	 * @see android.app.Activity#onCreate(Bundle)
	 */
	@Override
	protected void onCreate(Bundle icicle) {
		super.onCreate(icicle);
			setContentView(R.layout.inbox);
			
			lvInbox = (ListView)findViewById(R.id.lvInbox);
			bUpdate = (Button)findViewById(R.id.botonUpdate);
			
			
			data = new ArrayList<Recibidos>();
			
			adaptador = new ArrayAdapter<Recibidos>(getApplicationContext(), android.R.layout.simple_list_item_1, data);
			lvInbox.setAdapter(adaptador);
			
			setHandlersBotones();
			new asyncTaskProgressInBox().execute();
	}
	
	
	public class Recibidos {
		public String _correo = "";
		public void set_correo(String _correo) {
			this._correo = _correo;
		}
		public String _asunto = "";
		public void set_asunto(String _asunto) {
			this._asunto = _asunto;
		}
		public String _body = "";
		public void set_body(String _body) {
			this._body = _body;
		}
	}


Código:
Recibidos r = new Recibidos();
						r.set_correo(_emisor);
						r.set_asunto(_asunto);
						r.set_body(_message.getContent().toString());
						data.add(r);
Saludos
  #5 (permalink)  
Antiguo 25/10/2011, 13:20
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Problema con ArrayList, al llenarlo

Hola,

Posiblemente,

Cita:
Iniciado por javih Ver Mensaje
Lo de static era porque tenía una clase en otro archivo fuera de la activity pero ahora lo he metido dentro de la activity y eliminado lo de static y corregido a como dice la nomenclatura de Java. ...
Referente a la nomeclatura me refería al sistema para nombrar las variables y los métodos, en Java históricamente se ha usado el método camelCase, donde la primera palabra, normalmente un verbo se escribe con la primera minúscula; y la siguiente un sustantivo o adverbio se escribe con la primera mayúscula, pero no es obligatorio. Y los underscore _ están de más.

Código Java:
Ver original
  1. public String correo = "";
  2. public void setCorreo(String correo) {
  3.     this.correo = correo;
  4. }

Las clases estáticas solamente se puede crear una instancia y de allí en adelante te refieres a la misma, aunque uses el operador new para crear nuevos objetos.

Cita:
Iniciado por javih Ver Mensaje
... Ahora funciona hasta ahí, hasta el objeto Recibidos pero no llena el ArrayList ni establece el adapter ni nada. ...
Lo que no aparece es la forma y el momento (el cual es muy importante) en el cual llenas el ArrayList y lo despliegas, si llenas el ArrayList de forma asíncrona, es decir en un tiempo futuro indeterminado entonces el ArrayAdapter ni se entera que tiene nuevos datos, para lo cual tiene un método 'notifyDataSetChanged' para indicar que tiene nuevos datos y tiene que mostrarlos.

El posible problema es el 'hilo' (Thread) donde ejecutas el llenado del ArrayList, si lo llenas en un hilo independiente del hilo principal, no puedes modificar visualmente los componentes. Si usas un hilo separado para recibir los mensajes podrías usar Handler para poder modificar el display visualmente mientras se van recibiendo.

Saludos,
  #6 (permalink)  
Antiguo 25/10/2011, 15:10
Avatar de javih  
Fecha de Ingreso: agosto-2011
Mensajes: 201
Antigüedad: 13 años, 3 meses
Puntos: 12
Respuesta: Problema con ArrayList, al llenarlo

Hola, si es como dice, ya lo he solucionado todo.

No uso Thread, ya se lo que ocurre con eso, utilizo un AsyncTask y sino un Service, en este caso el primero.

El arrayList lo lleno de forma asíncrona, y utilizo publishProgress() en doInBackGround() y dentro de ese método tengo el notifyDataSetChanged()

Ahora todo está bien, según va encontrando los datos los va colocando en el ListView.

Pero sigo teniendo un problema , cuando ocurre el notifyDataSetChanged se inserta un nuevo dato en el objeto ArrayList pero resulta que reemplaza el valor de los demás, es decir si ya tenía un valor en el ArrayList

Correo1

y se inserta otro, Correo2, resulta que por pantalla muestra

Correo2
Correo2

y es cuando se está llenando el ArrayList pero no se el por qué.

Saludos y gracias

PD: lo de los guiones bajos ya lo cambié, nunca los uso pero me dió por usarlos. gracias por la explicación.
  #7 (permalink)  
Antiguo 25/10/2011, 15:22
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Problema con ArrayList, al llenarlo

Hola,

Cita:
Iniciado por javih Ver Mensaje
... Pero sigo teniendo un problema , cuando ocurre el notifyDataSetChanged se inserta un nuevo dato en el objeto ArrayList pero resulta que reemplaza el valor de los demás, es decir si ya tenía un valor en el ArrayList

Correo1

y se inserta otro, Correo2, resulta que por pantalla muestra

Correo2
Correo2
El problema son las clases estáticas, cuando creas una clase estática está es solamente una, aunque en el ArrayList esté varias veces, por decirlo de esta forma, cuando agregas el primer email se crea con Correo1, cuando agregas el segundo cambias el texto por Correo2, pero como es estática, simplemente estas desplegando la misma dos veces. El ArrayList tiene dos referencias diferentes al mismo objeto estático.

Cita:
Iniciado por javih Ver Mensaje
... PD: lo de los guiones bajos ya lo cambié, nunca los uso pero me dió por usarlos. gracias por la explicación.
En Java hay un patrón que se llama JavaBeans, el uso de esa nomeclatura es indispensable para que funcionen correctamente, por supuesto que eso es dentro de un editor como Eclipse o un contenedor web como Glassfish. Esas mismas clases las puedes reutilizar mas adelante para hacer un webservice, donde esos _ serían problemáticos. Aunque como es solamente dentro de Android que lo vas a usar es indiferente ... por el momento.

Saludos,
  #8 (permalink)  
Antiguo 25/10/2011, 19:04
Avatar de javih  
Fecha de Ingreso: agosto-2011
Mensajes: 201
Antigüedad: 13 años, 3 meses
Puntos: 12
Respuesta: Problema con ArrayList, al llenarlo

Hola,

Cita:
El problema son las clases estáticas, cuando creas una clase estática está es solamente una, aunque en el ArrayList esté varias veces, por decirlo de esta forma, cuando agregas el primer email se crea con Correo1, cuando agregas el segundo cambias el texto por Correo2, pero como es estática, simplemente estas desplegando la misma dos veces. El ArrayList tiene dos referencias diferentes al mismo objeto estático.
es que no hay nada estático en la Activity, ni variables ni clases.


Saludos
  #9 (permalink)  
Antiguo 25/10/2011, 19:45
Avatar de javih  
Fecha de Ingreso: agosto-2011
Mensajes: 201
Antigüedad: 13 años, 3 meses
Puntos: 12
Respuesta: Problema con ArrayList, al llenarlo

Hola,

Ya lo he solucionado, que torpe era que el objeto recibido solo lo creaba una vez lo he cambiado a donde itero y ahora perfecto.

Gracias por todo.

Saludos

Etiquetas: arraylist, apps
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:11.