Невозможно загрузить эскизы в ListView

В настоящее время я пытаюсь создать простую галерею изображений, такую ​​как теперь устаревшая Gallery Android. Из этой галереи пользователь также может перейти к простому редактору изображений, выбрав форму изображения в галерее. После большого количества Googling мне удалось найти HorizontalListView здесь, что именно то, что мне нужно. Первоначально я имел большой успех в этом, просто вставив изображения в свою папку в виде сжатых растровых изображений. С тех пор, однако, я нашел это видео из Google I / O, в котором они создают галерею изображений и редактор изображений; Подобно тому, что я пытаюсь создать. Однако есть два основных различия между моим приложением и их:

  • Они используют GridView для своей галереи, и я использую вышеупомянутый HorizontalListView
  • Я пытаюсь загружать только изображения с указанного целевого пути, а не только на все изображения на SD-карте.

Пока я не могу адаптировать свой код к моему, поскольку ни один из изображений не загружается в мою галерею. Как и в видео, я использую AsyncTask для загрузки моих миниатюр:

  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); } } } 

И я использую CursorAdapter для изображений в галерее:

  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); } } 

С помощью следующего 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); 

Любые идеи о том, почему ни одно из моих изображений не загружается?

Основная проблема здесь заключается в том, bindView() метод bindView() не ожидает результата asynctask. Вам необходимо уведомить ваш список, когда часть его содержимого будет изменена.

Вы можете внести следующие изменения.

1) Измените task.execute(photoId); task.execute(photoId).get(); Это заставит ваш bindView() подождать, пока вы не получите свое изображение. Этот подход не рекомендуется, но он поможет вам понять точную проблему.

ИЛИ

2) В onPost() аннулируйте старый контент в виде списка и попробуйте перезагрузить его новым контентом.

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

ИЛИ

3) Лично я предлагаю вам сначала завершить всю работу в сети (например, выборку изображений), изменив структуру кода, а затем попробуйте установить ваш адаптер с предварительно загруженными данными. Это не идеальное решение, но оно работает в моем случае.