2016-03-28 3 views
0

в моем приложении для Android, мне нужно показать миниатюры видео из каталога на sdcard. Я создаю эскизы с этим кодом:Показывать видео эскизы (растровые изображения) в Universal Image Loader

Bitmap bm = ThumbnailUtils.createVideoThumbnail(list.get(position).getPath() 
    .substring(8, list.get(position).getPath().length()), MediaStore.Images.Thumbnails.MINI_KIND); 

, что требует времени для создания эскизов. если я делаю это в классе async, позиция списка повторяется и отображает неправильные значки.

Как мне это сделать?

Edit 1: асинхронной класс:

public class CreateThumbnail extends AsyncTask<Integer, Void, Void> { 

      Bitmap bm; 

      @Override 
      protected Void doInBackground(Integer... params) { 
       bm = ThumbnailUtils.createVideoThumbnail(list.get(params[0]).getPath() 
         .substring(8, list.get(params[0]).getPath().length()), MediaStore.Images.Thumbnails.MINI_KIND); 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void aVoid) { 
       super.onPostExecute(aVoid); 
       imageView.setImageBitmap(bm); 
      } 
     } 

Edit 2: метод GetView:

CheckBox checkBox; 
     ImageView imageView; 
     int pos = 0; 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      ImageEntity imageEntity = (ImageEntity) this.getItem(position); 
      pos = position; 

      if (convertView == null) { 
       convertView = inflater.inflate(R.layout.item_grid_video, null); 

       imageView = (ImageView) convertView.findViewById(R.id.image); 
       checkBox = (CheckBox) convertView.findViewById(R.id.CheckBox1); 
       convertView.setTag(new ViewHolder(imageView, checkBox)); 
       checkBox.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View v) { 
         CheckBox cb = (CheckBox) v; 
         ImageEntity imageEntity = (ImageEntity) cb.getTag(); 
         imageEntity.setChecked(cb.isChecked()); 
         if (imageEntity.isChecked()) { 
          txtCount.setText(String.valueOf(++count)); 
          checkCounter(count); 
         } else { 
          txtCount.setText(String.valueOf(--count)); 
          checkCounter(count); 
         } 
        } 
       }); 
      } 

      else { 
       ViewHolder viewHolder = (ViewHolder) convertView.getTag(); 
       checkBox = viewHolder.getCheckBox(); 
       imageView = viewHolder.getImageView(); 
      } 

      checkBox.setTag(imageEntity); 

      checkBox.setChecked(imageEntity.isChecked()); 
      if (imageEntity.isVisibleCheckBoxes()) { 
       checkBox.setVisibility(View.VISIBLE); 
      } else { 
       checkBox.setVisibility(View.INVISIBLE); 
      } 


      imageView.setImageBitmap(ThumbnailUtils.createVideoThumbnail(list.get(position).getPath() 
        .substring(8, list.get(position).getPath().length()), MediaStore.Images.Thumbnails.MINI_KIND)); 
      //new CreateThumbnail().execute(position); 
      return convertView; 
     } 
+0

Пожалуйста, покажите нам еще код. Пожалуйста, покажите нам метод getView в представлении списка. –

+0

Отредактировано основная запись – Lithium

+0

Hi @Lithium, Вы пытаетесь добиться чего-то подобного следующему? Если это так, вам может потребоваться изменить код. https://www.google.lk/imgres?imgurl=http://2.bp.blogspot.com/-m_BYkz7SJKU/UGzFxRU5WKI/AAAAAAAACwk/zh3sE3siqHU/s1600/Android%252BList%252BView%252BExample.PNG&imgrefurl=https : //www.javacodegeeks.com/2012/10/android-listview-example-with-image-and.html&h=566&w=797&tbnid=SO8MmT5jtOrP_M: & DocId = XyTJ9DsCkyU_9M & е = qe_4VqGlOtDHuATB2rHYCw & TBM = Isch & вед = 0ahUKEwjhney3_-LLAhXQI44KHUFtDLsQMwgtKBEwEQ –

ответ

0

Вы создаете копию списка в коде асинхронном после того, как список закончил быть написано на?

Если нет (и ваша задача async вместо ссылки на исходный список), возможно, асинхронная обработка начинается до того, как список (предположительно содержимого каталога) будет полностью заполнен?

Бит трудно сказать без кода.

+0

I'v отредактировал главный пост и поставил класс асинхронизации – Lithium

1

Вот мой предложенный подход.

Позвоните по телефону CreateThumbnail из getView способ. Вы должны пройти index до AsyncTask.

После обработки миниатюры и внутри метода onPostExecute, Получите View, который представляет переданный индекс. Вы можете использовать ссылку this о том, как получить представление от listView, используя index.

Теперь вы можете настроить изображение на imageView, на котором у вас есть ссылка.

Однако будьте внимательны, если обновлен индекс listview.

Кроме того, вам может потребоваться отменить AsyncTask, когда пользователь прокручивает и элементы индекса прокручиваются с видимой части. В противном случае вы можете продолжать делать слишком много фоновых задач.

+0

спасибо за ваш ответ, но я немного смущен! Я передаю индекс классу async, но поскольку класс async действует как потоки, индекс отправляется, а предыдущий процесс еще не завершен.учитывая, что индекс не меняется, как я могу получить доступ к imageView внутри onPostExecute? наконец, конечно, пользователь будет прокручивать. если я отменил вызов asyncTask, он ничего не увидит. правильно? – Lithium

+0

Привет литий. Индекс элемента listview не изменяется. Проблема в том, что вы имеете в виду переменную класса с именем imageview. Вы не можете сделать это со списком, поскольку метод getview вызывается несколько раз. Вы должны передать индекс элемента списка вместе с задачей async. Затем вы должны использовать метод, который я дал ссылку, чтобы получить ссылку на правильное изображение. –