ArrayList Bidimensional

3,678 views
Skip to first unread message

Jefferson Delgado Pérez

unread,
Apr 11, 2013, 7:39:50 AM4/11/13
to desarrollad...@googlegroups.com
Buenas nuevamente a todos,

He estado buscando y la verdad no he encontrado nada que me aclare lo que necesito hacer.

Necesito tener un ArrayList de dos dimensiones, ambos campos de tipo String, para implementarlos en un HorizontalListView que si no me equivoco, me exige un tipo ArrayList.

He encontrado navegando la opción de ArrayList<String<String>> miLista = new ArrayList<String<String>>(): pero me peta con los dos String, así que buscando más he encontrado la opción ArrayList<ArrayList<String>> miLista = new ArrayList<ArrayList<String>>(); que no me falla aunque me parece quizás excesivo para lo que necesito. (Si alguno tiene otra idea, estoy abierto a todo :))

El asunto es que la quiero rellenar cada fila con dos elementos devueltos de un select, en plan miLista[ID_Usuario][Valor ID_Usuario].
Sé que para rellenar una ArrayList simple se usa miLista.add("XXX");, pero con dos dimensiones me pierdo bastante.

¿Alguno podría echarme un cable?


Muchas gracias! Saludos!!

Juan de Dios Maldonado Sánchez

unread,
Apr 11, 2013, 8:02:09 AM4/11/13
to desarrollad...@googlegroups.com
¿y por qué no te creas una clase que contenga esos dos valores y haces un array de instancias de esa clase?

public class DatosUsuario{
    public int idUsuario;
    public int valorUsuario;

    public DatosUsuario(int idUsuario, int valorUsuario){
        this.idUsuario = idUsuario;
        this.valorUsuario = valorUsuario;
    }
}

Luego sólo tienes que cargar los datos en cada objeto:

ArrayList<DatosUsuario> datos = new ArrayList<DatosUsuario>();
datos.add(new DatosUsuario(0,1));
...


2013/4/11 Jefferson Delgado Pérez <jjde...@gmail.com>

--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/20KhL
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android?hl=es.
Para ver este debate en la Web, visita https://groups.google.com/d/msg/desarrolladores-android/-/sN_bb4t1HYMJ.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
 
 

Jefferson Delgado Pérez

unread,
Apr 11, 2013, 8:18:33 AM4/11/13
to desarrollad...@googlegroups.com
Buenas Juan,

Justamente estaba comentando eso mismo con un compañero, el crearme un ArrayList de objetos y yo poder poner cualquier campo que quisiera.

Si yo quisiera meter en cada objeto 5 campos por ejemplo, luego para acceder al elemento 3 por ejemplo del primer registro, tendría que ser para el ejemplo anterior, datos.get(0).get(2);?

Para que entiendas lo que pretendo hacer, es leer de una tabla y obtener ciertos campos de cada registro y almacenarlos en un ArrayList.


Muchas gracias!



Un saludo!

Juan de Dios Maldonado Sánchez

unread,
Apr 11, 2013, 8:23:23 AM4/11/13
to desarrollad...@googlegroups.com
Para acceder al primer idUsuario: (tomando el código de ejemplo que te puse)

datos[0].idUsuario

Para acceder al segundo:

datos[1].idUsuario

Para acceder al primer valorUsuario:

datos[0].valorUsuario

Esto es MUY básico, aunque es normal tener dudas cuando uno empieza ya que nadie nade conociendo todo... Te recomiendo mirarte cualquier tutorial rápido de JAVA y aprendértelo de cabo a rabo. Y en un par de tardes estás al día.

Ehison de Jesus Perez Benedetti

unread,
Apr 11, 2013, 9:46:50 AM4/11/13
to desarrollad...@googlegroups.com
Bueno amigo como escribio el amigo la mejor practica seria que crearas una clase modelo donde definirías los atributos y esto te da como ventaja q en caso de q quieras agregas mas registro al arrayList solo lo agregas en el modelo y listo.

para que sea mejor te recomiendo que armes esa clase con algo como esto:


public class DatosUsuario{
  
    private int idUsuario;
    private int valorUsuario;

    public DatosUsuario(int idUsuario, int valorUsuario){
        this.idUsuario = idUsuario;
        this.valorUsuario = valorUsuario;
    }

    //Por las Buenas Practicas es bueno agregar un constructor vacio
    public DatosUsuario(){
    }
   
Por ultimo creas los get y set de las variables si usas eclipse en la opción de source tiene para generarlos automáticamente

Luego en la otra clase donde vas a llamar la lista arias algo así

ArrayList<DatosUsuario> datos = new ArrayList<DatosUsuario>();
DatosUsuario dato = new DatosUsuario(1, 'Caucagua')
datos.add(dato);

con esto estas agregando al array un objeto que tiene dos variables, y como puedes ver es el mismo código del compañero anterior pero un poco mas entendible.

y lo que te faltaría hacer es ejecutar el query contra la base de datos con la clase Cursor y la vas iterando y guardas los datos dentro del objeto que ya declaraste aqui te paso un ejemplo para que te puedas medio guiar

public String fechaActualizacion(int id) {
String fecha = null;
db = getWritableDatabase();
Cursor c = db
.rawQuery("SELECT fecha FROM fecha_actualizacion WHERE _id = "
+ id, null);
if (c.moveToFirst())
do {
fecha = c.getString(0);
} while (c.moveToNext());
c.close();
db.close();
return fecha;
}

 



   






Jefferson Delgado Pérez

unread,
Apr 11, 2013, 11:02:41 AM4/11/13
to desarrollad...@googlegroups.com
Muchas gracias a los dos por la gran respuesta que me han dado.

Muy cierto tu apunte Juan de que me lea un par de manuales en Java, pero es lo que tiene aprender a la vez que se trabaja de ello, pero bueno, menos mal que en foros siempre se consigue ayuda.

Me he implementado la clase tal y como me dijisteis, con sus getters y setters y adapté mi captura de datos por parte del select de la base de datos.

Ahora, como no, tengo otro problemilla, ya que necesito asignar los valores recogidos a los distintos textview de los distintos elementos del listview.

He intentado dos cosas, tanto como me comentaste Juan con btn1.setText(miLista[0].nombre) (me da error porque me comenta que tiene que ser un array y lo que le entra es un ArrayList, tanto con el propio método de la clase btn1.setText(miLista[0].getNombre());, pero me da el mismo error que el anterior.

Sé que es una tontería lo que falla, pero tras buscar no consigo saber lo que es; seguramente es un fallo conceptual, como la gran mayoría, pero se me resiste el "jodío".


Muchas gracias nuevamente.


Un saludo!

Jefferson Delgado Pérez

unread,
Apr 11, 2013, 11:14:50 AM4/11/13
to desarrollad...@googlegroups.com
Bueno, tras darle más vueltas, he encontrado la solución y es mediante la línea:

btn1.setText(miLista.get(j).getNombre());

Al método get() se le puede pasar un index que se posiciona en el elemento y simplemente hay que llamar seguidamente a getNombre() para obtener el dato requerido.

Me alegro haber solucionado algo por mi mismo :)


Gracias de todos modos.


Saludos!

Juan de Dios Maldonado Sánchez

unread,
Apr 11, 2013, 11:28:05 AM4/11/13
to desarrollad...@googlegroups.com
Ups! Como estaba trabajando en C# a la hora de responderte, mezclé conceptos a la hora de ponerte los ejemplos. En estas pequeñas diferencias se ve que Java está muy atrasado en el tiempo... :)

Jefferson Delgado Pérez

unread,
Apr 11, 2013, 11:36:39 AM4/11/13
to desarrollad...@googlegroups.com
No pasa nada, bastante hiciste con ponerme incluso un ejemplo bastante completo.
No podía ser todo tan bonito jeje.

Un saludo!

Jefferson Delgado Pérez

unread,
Apr 11, 2013, 1:37:10 PM4/11/13
to desarrollad...@googlegroups.com
Buenas nuevamente,

En un post anterior comento que ya consigo asignar el contenido a un TextView.
Mi sorpresa es cuando quiero asignar otro elemento a otro TextView, la aplicación peta por completo; de hecho, intento cambiar el elemento del primer TextView a mostrar y me peta, solo me funciona con getNombre().

Pongo el código para que se me entienda mejor:

public View getView(int position, View convertView, ViewGroup parent) {
View v = View.inflate(mContext, R.layout.vista_proyecto , null);
TextView id = (TextView)v.findViewById(R.id.idUsuario);
Button btn1 = (Button)v.findViewById(R.id.button1);

btn1.setText(miLista.get(j).getNombre());
id.setText(miLista.get(j).getId());
                j++;
if((j==miLista.size())) j=0;

return v;
  
La asignación al texto del botón la hace sin problemas, pero si cambio el tipo de valor que coloco o bien ejecuto la sentencia inferior de setText, la aplicación directamente se cuelga.

No entiendo por qué da error, ya que simplemente es asignar un valor a un textview :S
He comprobado que obtengo los datos del usuario correctamente.

¿Alguna idea de por qué este fallo tan tonto?


Saludos!

Juan de Dios Maldonado Sánchez

unread,
Apr 11, 2013, 1:43:38 PM4/11/13
to desarrollad...@googlegroups.com
Si tu id.setText(miLista.get(j).getId() devuelve un valor "int", no se lo puedes poner directamente al setText, ya que significa una cosa completamente distinta, e intentará encontrar un recurso con ese identificador, y te peta porque no lo encuentra.

Pasa ese id a una cadena de texto, por ejemplo haciendo:

""+id.setText(miLista.get(j).getId()

Jefferson Delgado Pérez

unread,
Apr 11, 2013, 1:48:38 PM4/11/13
to desarrollad...@googlegroups.com
Buenas!

Tengo que convertir a String entonces el int del id? Pensaba que el TextView se "tragaba" todo lo que le mandaras...

Bueno, te hice caso y con id.setText(String.valueOf(miLista.get(j).getId())); me lo ha pillado perfectamente.


Gracias nuevamente :)
Reply all
Reply to author
Forward
0 new messages