0 votos

Hola mi nombre es mario hace unos días decidí meterme en el mundo de tratar de desarrollar para andoid, una de las primeras dudas que me surgió fue el trabajo con listview y encontré este ejemplo

http://jarroba.com/listview-o-listado-en-android/
la verdad lo mejor de todo lo que encontré en internet en el poco tiempo que tengo acceso desde mi país. Bueno, empecé a usar el código dentro de mi proyecto pero me surgió un problema y la verdad no supe como solucionarlo por eso pido de tu ayuda a ver si puedo avanzar. El tema es que todos los datos que yo voy a utilizar para cargar en el listview vienen de una bd externa, hasta ahí todo bien, pude integrarla y está funcionando todo pero no las imágenes, por una cuestión de que en cuba no hay Conexión personalizada disponible, ni wifi libre funcional ni servicio de operador que me permita publicar en algún servicio información que el usuario final pueda descargar para completar el funcionamiento, a no ser que sea estatal (lo cual no es mi caso) me fue indispensable agregar las fotos que van en el listview a un campo blob correspondiente en la base de datos y aquí está el problema como puedo configurar mi proyecto para que sea capas de cargar esas imágenes correspondientes a cada item del listview desde la base de datos , podrías decirme como puedo agregar los datos para las imágenes que están en campos blob a la lista de entrada y a la lista_adaptador ??????, sería de mucha ayuda, en el sitio vi esta pregunta con su respuesta abajo, pero no me quedó claro, soy bastante novato en esto, aunque en el caso de abajo el busca fotos en el cel en mi caso es un fichero blob desde la base de datos.

PAUL
13 octubre, 2014 a las 7:42

Buenas noches, felicitarte por tu post justo es algo muy parecido que quiero hacer, pero mi duda es, si las imágenes los tengo desde un lugar Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) +nombreFoto+ “.jpg”
como se haria para poder crear un objeto teniendo un .jpg porque veo que lo hacen asi:

datos.add(new Lista_entrada(R.drawable.im_colibri, “texto”)

pero no es un tipo R.drawable porque no esta la imagen dentro del proyecto, asi que mi duda va como convertir esa imagen jpg en un entero: int idImagen. Para que el constructor: public Lista_entrada (int idImagen, String textoEncima, String textoDebajo) { } lo reciba. Les agradezco su respuesta.
Responder
Ramón [Admin Jarroba]
13 octubre, 2014 a las 23:20

Hola Paul, gracias por las felicitaciones,
para hace lo de las foto guardadas tienes que obtenerlas directamente de la tarjeta de memoria (en este caso te tienes que olvidar de los enteros, ya que son para llamar a las imágenes que están en la carpeta drawable del proyecto) y dibujarlas como bitmap:

ImageView iv = (ImageView) findViewById(R.id.miImageView);
mImg.setImageBitmap(miImagenCargadaDeMemoria);

 

por en Android

1 Respuesta

0 votos
Mejor respuesta

Hola Mario,

Para los desarrolladores es complicado trabajar con limitaciones de Internet ya que es una herramienta fundamental. Se lo qué es eso por compañeros Cubanos que han estado en esa misma situación.

Sobre tu pregunta. Guardar en un Blob en la base de datos es una buena idea, pero sin pasarse. Si quieres guardar muchas imágenes mejor con el almacenamiento interno o externo (tienes un ejemplo en http://developer.android.com/guide/topics/data/data-storage.html#filesInternal)

Para hacer lo que necesitas, obtener las imágenes desde blob. Como estás trabajando con base de datos supongo que entenderás como obtener el Cursor para recorrer las filas de las tablas. Voy a suponer que tienes ya un Cursor llamado como cursor. El código es el siguiente:

cursor.moveToNext();
byte[] array_bits_imagen = cursor.getBlob(cursor.getColumnIndexOrThrow("miColumnaDondeEstaLaImagenEnBlob"));
//El siguiente método calculateInSampleSize() lo definiremos luego.
Bitmap bitmap = calculateInSampleSize(contexto, array_bits_imagen, reqWidth, reqHeight);
ImageView iv = (ImageView ) findViewById(R.id.viewDondeColocarLaImagen);
iv.setImageBitmap(bitmap);

El siguiente método es el que devuelve la imagen del array de byte a un bitmap (es una modificación del método obtenido de http://developer.android.com/training/displaying-bitmaps/load-bitmap.html). Hay que pasarle el Context, los bytes de la imagen y los dos parámetros de tamaño reqWidth y reqHeight que queremos que tenga (el tamaño que requerimos que tenga la imagen, como puede ser la altura y la anchura del ImageView donde vaya a ir colocado)

	public static Bitmap calculateInSampleSize(Context contexto, byte[] array_bits_imagen, int reqWidth, int reqHeight) {
		final BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeByteArray(array_bits_imagen, 0, array_bits_imagen.length, options);
		final int height = options.outHeight;
		final int width = options.outWidth;
		int inSampleSize = 2;
		if (height > reqHeight || width > reqWidth) {
			final int heightRatio = Math.round((float) height / (float) reqHeight);
			final int widthRatio = Math.round((float) width / (float) reqWidth);
			inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
		}
		options.inSampleSize = inSampleSize;
		options.inJustDecodeBounds = false;
		return BitmapFactory.decodeByteArray(array_bits_imagen, 0, array_bits_imagen.length, options);
	}

Muchos ánimos!!!

por
Hola, Ramón, Hola Mario:

Voy a aprovechar las consultas de Mario pues yo pensaba agregar unas imágenes a mi base de datos en la aplicación que estoy haciendo, y aunque aún no he llegado a eso me interesa ir entendiéndolo.

Ramón, dices que guardar imágenes en SQLite es buena idea pero sin pasarse, y yo quiero entender bien a qué te refieres con eso. Pensaba agregar un campo Blob para imágenes en un par de tablas de mi aplicación, y quiero entender a cabalidad lo que significa no pasarse, si te refieres a cantidad de imágenes eso dependerá de la cantidad de registros de cada una de estas dos tablas, y eso es difícil de medir, pero en principio podríamos estar hablando de unas 500 – 1000 imágenes en total en la BD, lo cual no me parece demasiado pero me gustaría conocer tu opinión.

Mario, mi solidaridad contigo, cuando el alma y la mente son libres no hay cadenas que puedan detenerlas.

Saludos,
Pilar
Me refiero a que una base de datos relacional es mejor utilizarla para datos textuales (textos, números, urls, etc), pues lo que nos interesa es almacenar datos que puedan ser buscados y relacionados rápidamente. Guardar imágenes no es para lo que está pensado principalmente una base de datos SQL, lo que se suele guardar es una url que apunte a la imagen, una clave que la identifique, etc, y luego la imagen (hablo de imágenes aunque se aplica a cualquier otro fichero) en otro lado que esté preparado (en Android la memoria interna o externa).

Por eso con lo de buena idea me quiero referir a casos muy concretos. Si tuviera que recomendar, no recomendaría guardar nunca en la base de datos ficheros (procurar no usar blob, aunque sí saber como se utiliza por si acaso).
ok, mil gracias

OK Ramon, muchisimas gracias por tu pronta respuesta y Pilar gracias por la solidaridad.
Te cuento que el fin de semana estuve trabajando en la casa sobre esto, Al mismo ejemplo basado en el link que me das de google pues un amigo me lo dio offline pues google (más que nadie ) al igual que adobe, está bloqueado por el embargo para Cuba, cuando entro a algo de ellos me sale un cartel de embargo y que no pudo entrar, irónico, tratándose en su mayoría de free software, pero bueno, eso no debe ser una limitación. Lo hice muy parecido, pudiera decirse que idéntico, pero sigo teniendo problemas, me explico.

Primero, en mi caso las imágenes que voy a tener en mi base de datos como ficheros blob no serán más de 50, posiblemente ni lleguen a ese número, bien pequeñitas.
Ahora el detalle está que cuando trato de integrar esto con el ejemplo del listview proporcionado por ti en la página http://jarroba.com/listview-o-listado-en-android/ sencillamente al aplicar el

iv.setImageBitmap(bitmap);

el listview me coge la imagen pero la ultima de la columna para todos los elementos de la lista.
El problema es que no puedo usar como en el caso del setresource donde le puedo pasar parámetros.
o sea

ImageView imagen_entrada = (ImageView) view.findViewById(R.id.imageView_imagen);
if (imagen_entrada != null)
imagen_entrada.setImageResource(((Lista_entrada) entrada).get_idImagen());

donde al setImageResource le puedo pasar la posición para el elemnto correspondiente del arreglo, e el caso de setImageBitmap solo me da el parámetro bitmap y funciona, de que funciona funciona, pero siempre todos los elementos del listview me asumen la última imagen de la columna blob imagen, realmente no se me ocurre como extender el arreglo para que me asuma la imagen correspondiente a las imágenes dentro del listview.

Te cuento que este ejemplo me vino como anillo al dedo porque ya tenía adelantado mucho sobre mapas, que necesito en mi proyecto, también elementos de la base de datos, pero me faltaba donde volcar la información inicial y apareció tu proyexcto de listview que para mis pocos conocimientos con java y android fue el más sencillo de entender y aplicar.
Si pudieras ayudarme con el tema este sería de gran ayuda, si la termino, no creo que pueda poner mi aplicación en googleplay, por mis problemas de embargo con Cuba, pero ten por seguro que una copia de la app terminada con tu nombre y el link del foro será incluida en ella.
Gracias mil
Mario

Bueno te informo que ya lo solucioné ja, la verdad que a veces uno se bloquea teniendo la respuesta frente s los ojos y eso que el fin de semana me rompí la cabeza, pero no la respeusta me acaba de llegar justo ahora mismo.
el problema es que en lista entrada estaba declarando a idImagen del tipo byte[] y cuando trataba de pasarle los parametros al
iv.setImageBitmap(bitmap); me daba error tratando de meter los demas argumentos claro peus el tipo era de Bitmap, asi que en lista_entrada cambié para bitmap y la conversion de byte[] la hice en una variable que es la que paso a iv.setImageBitmap(bitmap), quedando
imagen_mia.setBitmap(((Lista_entrada)entrada).get_imagen());
y como la variable era de bitmap pues entocnes si funcionó de maravillas, de todas formas un millon de gracias por la ayuda y la iformación, seguro seguiré molestando por aquí con más dudad proque soy nuevo totalmente en android, pero eso será para el mes que viene proque solamente me quedan 20 mb de navegación de la cuota de internet de este mes.
Saludos Mario

Me alegra saber que has conseguido seguir adelante, lo mejor para aprender programación es encontrarse con los problemas y resolverlos :D

Y ya sabes, si tienes cualquier duda por aquí estaremos para ayudar en lo que necesites.

Hola Ramón, otra preguntica más sobre el mismo tema, en el proyecto que aun no termino, por conexión y por fuerzas a veces ajenas a mí , tengo un problema que no he podido darle solución, generalmente las imágenes del listview van a ser cargadas de la base de datos, eso ya funciona perfectamente en su mayoría gracias a ti, ahora el detalle está que pueden existir registros donde no existan imágenes y necesito que no se me quede en blanco sino que llame a un recurso “imagen “que está en el proyecto(res), como puedo hacerlo , esto debe saltar desde que el blob detecte que es nulo saber que cuando es nulo no hacer la conversión a imagen y cargar la foto (no foto) desde un recurso local, si pudieras ayudarme a coger la idea te lo agradecería. De antemano muchas gracias

Buenas de nuevo Mario,

es muy sencillo, cuando recorras el cursor de la base de datos, tan solo has de ir mirando si es null o vacío, según tengas el campo blob. Si es null o vacío, en vez de intentar cargar la imagen blob, lo que hacemos es cargar directamente una imagen desde los recursos. Es decir, en vez de usar

iv.setImageBitmap(bitmap);

utilizas

iv.setImageResource(R.drawable.mi_drawable);

Lo tienes en nada :)

Thanks you, me salvaste nuevamente de un problemon :) espero terminar pronto y cumplir lo prometido