No se pueden cargar las miniaturas en ListView

Actualmente estoy intentando hacer una galería de imágenes sencilla como la ya desaprobada Gallery Android. Desde esta galería el usuario también puede navegar a un editor de imágenes sencillo seleccionando una imagen de la galería. Después de mucho Googling me las arreglé para encontrar un HorizontalListView aquí que es exactamente lo que necesito. Inicialmente tuve mucho éxito con esto simplemente insertando las imágenes en mi carpeta como bitmaps comprimidos. Desde entonces, sin embargo, he encontrado este video de Google I / O en el que crean una galería de imágenes y un editor de imágenes; Similar a lo que estoy tratando de crear. Sin embargo, hay dos diferencias principales entre mi aplicación y la suya:

  • Utilizan un GridView para su galería y yo uso el HorizontalListView mencionado anteriormente
  • Estoy intentando cargar solamente imágenes de una trayectoria especificada de la blanco algo que apenas todas las imágenes en la tarjeta del SD.

Hasta ahora no soy capaz de adaptar su código a la mía como ninguna de las imágenes se cargan en mi galería. Como con el video utilizo un AsyncTask para cargar mis miniaturas:

  private class ThumbnailAsyncTask extends AsyncTask<Long, Void, Bitmap> { //The ImageView we will be adding the thumbnail to private final ImageView mTarget; public ThumbnailAsyncTask(ImageView target) { mTarget = target; } @Override protected Bitmap doInBackground(Long... params) { final long photoID = params[0]; final Bitmap result = MediaStore.Images.Thumbnails.getThumbnail( getContentResolver(), photoID, MediaStore.Images.Thumbnails.MINI_KIND, null); return result; } @Override protected void onPreExecute() { mTarget.setTag(this); } @Override protected void onPostExecute(Bitmap result) { if (mTarget.getTag() == this) { mTarget.setImageBitmap(result); mTarget.setTag(null); } } } 

Y estoy usando un CursorAdapter para las imágenes en la galería:

  private class PhotoAdapter extends CursorAdapter { public PhotoAdapter(Context context) { super(context, null, false); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return LayoutInflater.from(context).inflate(R.layout.list_item, parent, false); } @Override public void bindView(View view, Context context, Cursor cursor) { final long photoId = cursor.getLong(cursor.getColumnIndex(BaseColumns._ID)); final ImageView imageView = (ImageView) view.findViewById(android.R.id.icon); /* * Cancel any pending thumbnail task, since this view is now bound * to new thumbnail */ final ThumbnailAsyncTask oldTask = (ThumbnailAsyncTask) imageView.getTag(); if (oldTask != null) oldTask.cancel(false); /* * If we arrived here, either cache is disabled or cache miss, so we * need to kick task to load manually */ final ThumbnailAsyncTask task = new ThumbnailAsyncTask(imageView); imageView.setImageBitmap(null); imageView.setTag(task); task.execute(photoId); } } 

Con el siguiente CursorLoader

  final LoaderCallbacks<Cursor> mCursorCallbacks = new LoaderCallbacks<Cursor>() { @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { final String[] columns = {BaseColumns._ID}; return new CursorLoader(NewProjectActivity.this, Uri.fromFile(new File(mTargetPath)), columns, null, null, MediaStore.Images.Media.DATE_ADDED + " DESC"); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { mAdapter.swapCursor(data); } @Override public void onLoaderReset(Loader<Cursor> loader) { mAdapter.swapCursor(null); } }; getLoaderManager().initLoader(LOADER_CURSOR, null, mCursorCallbacks); 

¿Alguna idea de por qué ninguna de mis imágenes se está cargando?

El problema básico aquí es, bindView() método no está esperando el resultado de asynctask. Debe notificar a su vista de lista cuando algo de su contenido se cambia.

Puede realizar los siguientes cambios.

1) Cambiar task.execute(photoId); A task.execute(photoId).get(); Esto obligará a su método bindView() a esperar hasta que obtenga su imagen. Este enfoque no es recomendable, pero le ayudará a entender el problema exacto.

O

2) En onPost() de asynctask , invalida el contenido antiguo de la vista de lista e intenta volver a cargarlo con nuevo contenido.

 mAdapter.notifyDataSetChanged(); mAdapter.notifyDataSetInvalidated(); 

O

3) personalmente le sugeriré terminar toda la operación de la red primero (es decir buscar imágenes) cambiando su estructura del código y después después de intentar fijar su adaptador con los datos prefetched. Esta no es una solución perfecta, pero funcionó en mi caso.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.