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

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 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); 
  • Error en la conexión http java.lang.IllegalArgumentException: El carácter no permitido en la consulta en el índice 76
  • Recuperar recursos extraíbles de Uri
  • Inicio de mi aplicación mediante el URI de intención
  • Android Wear elimina datos de DataApi con deleteDataItems
  • ¿Cómo puedo transformar un Bitmap en un Uri?
  • Cómo restaurar el archivo vcf sin utilizar la aplicación externa?
  • ENOENT (ningún archivo o directorio) cuando hay un archivo allí
  • Visualización de imágenes de una carpeta específica de la tarjeta SD mediante una vista de cuadrícula
  • Agregar calendario y eventos en Android 2.2
  • CursorLoader, obtiene URI para la base de datos local
  • ¿Cómo obtengo el URI de mi base de datos SQLite en mi aplicación para Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.