Visualización dinámica de imágenes del recurso / dibujable
Estoy tratando de poner diferentes imágenes (.jpg, .png) dinámicamente en un ListView
de r es/drawable
. Los nombres de las imágenes que obtengo de una base de datos. Las imágenes están en la carpeta res/drawable
.
Esto es lo que ya tengo, con un error de: D
- Actividad de captura de cámara Android devuelve null Uri
- Obtener orientación de la imagen de MediaStore.Images.Media.DATA
- Problemas con el UriMatcher de Android
- Identificador de fragmento (#) en Uri no funciona correctamente
- Cómo obtener HTML5 video URI en HTML5VFullScreen $ SurfaceVideoView en Android 4.0?
String imgName; -> Hay los nombres img que necesito de la base de datos
Drawable drawable; drawable = Class.appContext.getResources().getDrawable(Class.appContext.getResources().getIdentifier("com.example.test:drawable/"+imgName,null,null));
Entonces consigo esto en un ArrayList
para cada imagen en la base de datos (+ – 200 imágenes):
ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>(); HashMap<String, Object> map = new HashMap<String, Object>(); map = new HashMap<String, Object>(); map.put("img",drawable); map.put("text", "some text"); list.add(map);
Ahora vuelvo a la lista;
En la clase donde llamo:
listReceive = Class.getImages(appContext); listSetup = new SimpleAdapter(this, listReceive, R.layout.row, new String[] {"img", "text"}, new int[] {R.id.IMG_CELL, R.id.TEXT_CELL}); lvList.setAdapter(listSetup);
La fila XML es un ImageView
y un TextView
.
System.out: resolveUri falló en el mapa de bits incorrecto uri: android.drawable.bitmapDrawable@405739 resolveUri falló en el mapa de bits incorrecto uri: android.drawable.bitmapDrawable@405639 resolveUri falló en el mapa de bits incorrecto uri: android.drawable.bitmapDrawable@405959 resolveUri falló en mal bitmap uri: android.drawable.bitmapDrawable@405677 … … …
Lo conseguí trabajando cuando guardé imágenes en memoria local o SDcard, y luego puse el camino dentro del arraylist como:
map.put("img","/data/data/com.example.test/images/" + imgName);
No puedo utilizar esto porque entonces necesitaré copiar las imágenes de res/drawable
en local o SD. Esto toma hasta 2 veces la memoria. no puede tener eso de.
Debe haber una manera de obtener imágenes dinámicamente desde el dibujable.
¿Alguien sabe lo que me falta aquí? Gracias.
- ¿El método getoutputmediafileuri no es accesible?
- ¿Cómo comprobar si el recurso apuntado por Uri está disponible?
- Conversión de archivo: // esquema a contenido: // esquema
- Android: vinculación de aplicaciones - sólo admite ciertos caminos?
- El antiguo constructor de SimpleCursorAdapter desaprobó .. realmente?
- ¿Existe un esquema URI universal para la aplicación de Facebook, que funciona en todos los dispositivos móviles?
- Cómo obtener un objeto Uri desde Bitmap
- Abrir en la intención del navegador cuando el enlace también redirecciona con deep-linking
El SimpleAdapter espera un entero o cadena que especifica un recurso o una imagen URI:
public void setViewImage (ImageView v, String value) Since: API Level 1
Llamada por bindView () para establecer la imagen de un ImageView, pero sólo si no existe ViewBinder existente o si el ViewBinder existente no puede manejar el enlace a un ImageView. De forma predeterminada, el valor se tratará como un recurso de imagen. Si el valor no se puede utilizar como un recurso de imagen, el valor se utiliza como una imagen Uri. Este método se llama en lugar de setViewImage (ImageView, int) si los datos suministrados no son un int o Integer.
Creo que debería usar setViewBinder para proporcionar un ViewBinder para que el SimpleAdapter
maneje el enlace de los datos Drawable
a ImageView
. Básicamente, el método setViewValue () debe devolver false a menos que se llame para su vista de imagen. Cuando se llama para la vista de imagen, el método debe establecer los datos en la vista y devolver true. El valor de retorno indica si el ViewBinder pudo establecer la vista o si el adaptador debía intentar vincular los datos a través de su comportamiento predeterminado.
Tal vez algo como:
private final SimpleAdapter.ViewBinder mViewBinder = new SimpleAdapter.ViewBinder() { @Override public boolean setViewValue( final View view, final Object data, final String textRepresentation) { if (view instanceof ImageView) { ((ImageView) view).setImageDrawable((Drawable) data); return true; } return false; } }; ... listSetup .setViewBinder(mViewBinder);
He hecho una cosa similar con un SimpleCursorAdapter y su ViewBinder.
El adaptador simple espera String en el mapa. Pero su mapa contiene un dibujable para la clave "img".
En su lugar, intente extender la clase BaseAdapter . Anule el método getView y, a continuación, establezca manualmente el dibujable en la vista de imagen y el texto en la vista de texto.
Otro pensamiento, podría no ser una buena idea mantener cada dibujable en la memoria. Obtenga el dibujable dinámicamente al renderizar esa fila particular de la lista
Este siguiente método o forma también funciona – si alguien está todavía interesado
List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>(); Integer flags[] = new Integer[listdetail.size()]; Resources resources = getResources(); for (int i = 0; i < listdetail.size(); i += 2) { listName = listdetail.get(i).getName(); int dynamicId = resources.getIdentifier(listdetail.get(i).getName().replaceAll(" ", "").toLowerCase(), "drawable", getActivity().getPackageName()); if(dynamicId == 0) { dynamicId = R.drawable.test_image; flags[i] = dynamicId; }else { flags[i] = dynamicId; } HashMap<String, String> hm = new HashMap<String, String>(); hm.put("value1", listdetail.get(i).getName()); hm.put("valueImage1", Integer.toString(flags[i])); list.add(hm); } String[] from = { "value1", "valueImage1"}; int[] to = { R.id.textview, R.id.imageView }; SimpleAdapter adapter = new SimpleAdapter(getActivity().getBaseContext(), list, R.layout.listlayout, from, to); ListView listView = (ListView) getActivity().findViewById(R.id.listview); listView.setAdapter(adapter);
- Creación de un directorio en la memoria interna (carpeta raíz)
- ¿El depurador de Android trunca mensajes de depuración?