Как я могу предотвратить отображение изображений в этом списке Android от переключения, когда я нажимаю на другие элементы экрана?

StackOverflow https://stackoverflow.com/questions/4287412

Вопрос

Я сделал еще один пост ранее об этой теме, но я с момента изменил свой код немного на основе предложений, но такая же проблема существует. Мои изображения продолжают переходить, если я нажимаю на другие элементы на экране.

Вот мой код, который я звоню этим:

новый миниатюр (image_main, image_table) .execute (image);

Image_Main - мой ImageView и Image_Table - это таблица, которая его удерживает.

 private class Thumbnailer extends AsyncTask<String, Void, Bitmap> {
      private ImageView imageView;
      private TableLayout imageTable;

        public Thumbnailer(ImageView imageView, TableLayout imageTable) {
            this.imageView = imageView;
            this.imageTable = imageTable;
        }

  @Override
  protected void onPostExecute(Bitmap result) {
      imageView.setImageBitmap(result);
               imageView.setVisibility(View.VISIBLE);
               imageTable.setVisibility(View.VISIBLE);
  }
  @Override
      protected void onProgressUpdate(Void... progress) {
      }

  @Override
  protected Bitmap doInBackground(String... params) {
         BitmapFactory.Options o = new BitmapFactory.Options();
          o.inJustDecodeBounds = true;
          BitmapFactory.decodeFile(params[0], o);
          final int REQUIRED_SIZE=70;

          //Find the correct scale value. It should be the power of 2.
          int width_tmp=o.outWidth, height_tmp=o.outHeight;
          int scale=1;
          while(true){
              if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                  break;
              width_tmp/=2;
              height_tmp/=2;
              scale++;
          }
          //Decode with inSampleSize
          BitmapFactory.Options o2 = new BitmapFactory.Options();
          o2.inSampleSize=scale;       
          return BitmapFactory.decodeFile(params[0], o2);
  }
 }
Это было полезно?

Решение

Похоже, вы укусываетесь с точки зрения переработки. То есть, когда вы прокрутите список в Android, он не создает новую строку и вместо этого повторно использует ряд, снятую за окном. В этом случае, которые могут привести к нескольким задачам, пытаясь загрузить изображение в одно изображение. Вы эффективно нуждаетесь в том, чтобы как-то быть в состоянии сказать, какой запрос нагрузки является самым последним для ряд и отменить более ранние / игнорировать их результаты или просто использовать библиотеку, которая обрабатывает это для вас (например, droid-fu).

Вы также можете просто отключить переработки просмотра в своем адаптере (это часть, которая использует convertView аргумент в getView Метод), но осознавать, что это сделает список прокрутки медленного и дрожания, особенно на старых устройствах.

Другие советы

У меня была аналогичная проблема. Я бы загрузил изображения в список просмотров через Asynctask (что может получить изображение через http), и, казалось, загружается неправильное изображение для разделения секунды, прежде чем загрузить правильный. Это было так, как если Android повторно повторно повторно повторно заканчивая ряд до завершения запроса HTTP, а асинктдаки были вроде столкновения.

Комментарии выше подтверждены, что это происходит.

Я исправил его, поместив путь к изображению в тегу изображения, прежде чем начинается Asynctask, а затем проверяйте этот тег после окончания Asynctask, но непосредственно перед ней вызывают setimagebitmap.

Добавьте эти строки:

final String somethingUnique = "put the image path or some other identifier here";
image_main.setTag(somethingUnique);

До этой линии:

new Thumbnailer(image_main, image_table).execute(image);

Теперь, в OnPostexecute, проверьте тег:

// if this does not match, then the view has probably been reused
if (((String)imageView.getTag()).equals(somethingUnique)) {
  imageView.setImageBitmap(result);
}

Этот Сообщение блога разработчика Android Предоставляет ссылочный проект для этого. Просто измените код скачивания HTTP-изображения в проекте к вашему doInBackground код.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top