Как можно предотвратить смещение изображений в этом списке Android при нажатии на другие элементы экрана? - PullRequest
1 голос
/ 26 ноября 2010

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

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

новый Thumbnailer (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);
  }
 }

Ответы [ 3 ]

5 голосов
/ 20 апреля 2012

У меня была похожая проблема.Я загружал изображения в ListView через AsyncTask (который мог бы получить изображение через HTTP), и он, казалось, загружал неправильное изображение в течение доли секунды перед загрузкой правильного.Как будто Android повторно использовал строку до завершения HTTP-запроса, и AsyncTasks вроде как сталкивались.

Приведенные выше комментарии подтвердили, что это происходит.

Я исправил это, поместивпуть к изображению в теге ImageView до запуска AsyncTask, а затем проверка этого тега после завершения AsyncTask, но непосредственно перед вызовом setImageBitmap.

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

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

Beforeэта строка:

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);
}
4 голосов
/ 26 ноября 2010

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

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

0 голосов
/ 31 июля 2012

В этом блоге разработчика Android содержится справочный проект для этого. Просто измените код загрузки изображения http в проекте на doInBackground код.

...