2014-10-15 3 views
0

В настоящее время я загружаю все видео на устройство в пользовательский ListAdapter, который показывает миниатюру для видео + больше. Я заметил, как я добавляю все больше и больше видео, которые начинают медленнее запускать. Это как мой адаптер Список выглядит следующим образом:Отображение миниатюр для Android в ListAdapter

public class VideoListAdapter extends ArrayAdapter<Video> { 

    private ArrayList<Video> allVideos; 
    private HashMap<String, Bitmap> bitmapCache; 

    public VideoListAdapter(Context context, ArrayList<Video> videos) { 
     super(context, R.layout.video_list_item, videos); 
     this.allVideos = videos; 
     /* Cache the thumbnails */ 
     setUpBitmaps(); 
    } 

    private void setUpBitmaps() { 
     bitmapCache = new HashMap<String, Bitmap>(allVideos.size()); 
     for(Video video : allVideos){ 
      bitmapCache.put(video.getDATA(), ThumbnailUtils.createVideoThumbnail(video.getDATA(), Thumbnails.MICRO_KIND)); 
     } 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View row; 
     if (convertView == null) { 
      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      row = inflater.inflate(R.layout.video_list_item, null); 
     } else { 
      row = convertView; 
     } 

     Video tmpVideo = allVideos.get(position); 

     String TITLE = tmpVideo.getTITLE(); 
     long vidDur = Long.valueOf(tmpVideo.getDURATION()); 
     String DURATION = String.format(Locale.getDefault(),"%02d:%02d", 
       TimeUnit.MILLISECONDS.toMinutes(vidDur) - 
       TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(vidDur)), 
       TimeUnit.MILLISECONDS.toSeconds(vidDur) - 
       TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(vidDur))); 

     String filepath = tmpVideo.getDATA(); 
     Bitmap thumbnail = bitmapCache.get(filepath); 

     TextView tvTitle = (TextView) row.findViewById(R.id.tvListItemVideoTitle); 
     TextView tvDuration = (TextView) row.findViewById(R.id.tvListItemVideoDuration); 
     ImageView ivThumbnail = (ImageView) row.findViewById(R.id.ivListItemVideoThumbnail); 

     tvTitle.setText(TITLE); 
     tvDuration.setText(DURATION); 
     if(thumbnail != null){ 
      ivThumbnail.setImageBitmap(thumbnail); 
     } 

     return row; 
    } 
} 

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

Любые предложения были бы весьма полезными.

Маркус

+0

использовать библиотеки для кэширования thumbnalis..instead загрузки их на всем протяжении again..this позволит сократить время – Meenal

+0

вы можете использовать aquery library..it сохранит эскизы ... – Meenal

+0

также использовать Класс ViewHolder для просмотра intialisation .. – Meenal

ответ

0

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

Bitmap thumb = ThumbnailUtils.createVideoThumbnail(path, 
MediaStore.Images.Thumbnails.MINI_KIND); 
+0

Я уже делаю это, если вы посмотрите на мой код. – Marcus

+0

затем используйте lazylist, который правильно загрузит изображения. Http://stackoverflow.com/questions/15621936/whats-lazylist –

0
You can use lazyloading for this,LazyLoading will make your list scroll fast.Follow this library it will help: 

https://github.com/nostra13/Android-Universal-Image-Loader 

Steps of using lazy loading : 

1.)Download jar file from this link: 
http://www.java2s.com/Code/Jar/u/Downloaduniversalimageloader161withsrcjar.htm 

2.)Create Application File : 
import android.app.Application; 
import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache; 
import com.nostra13.universalimageloader.core.DisplayImageOptions; 
import com.nostra13.universalimageloader.core.ImageLoader; 
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; 
import com.nostra13.universalimageloader.core.assist.ImageScaleType; 
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; 

public class MyApplication extends Application { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 

     // UNIVERSAL IMAGE LOADER SETUP 
     DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() 
       .cacheOnDisc(true).cacheInMemory(true) 
       .imageScaleType(ImageScaleType.EXACTLY) 
       .displayer(new FadeInBitmapDisplayer(300)).build(); 

     ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
       getApplicationContext()) 
       .defaultDisplayImageOptions(defaultOptions) 
       .memoryCache(new WeakMemoryCache()) 
       .discCacheSize(100 * 1024 * 1024).build(); 

     ImageLoader.getInstance().init(config); 
     // END - UNIVERSAL IMAGE LOADER SETUP 
    } 
} 

3.)On your activity in whcih you want to use ,write this it onCreate(): 

DisplayImageOptions options = new DisplayImageOptions.Builder() 
       .showImageOnLoading(R.drawable.iclauncher) // resource or 
                   // drawable 
       .showImageForEmptyUri(R.drawable.iclauncher) // resource or 
       // drawable 
       .showImageOnFail(R.drawable.iclauncher) // resource or 
                  // drawable 
       .resetViewBeforeLoading(false) // default 
       .delayBeforeLoading(1000).cacheInMemory(true) // default 
       .cacheOnDisc(true) // default 
       .considerExifParams(true) // default 
       .imageScaleType(ImageScaleType.IN_SAMPLE_INT) // default 
       .bitmapConfig(Bitmap.Config.ARGB_8888) // default 
       .displayer(new SimpleBitmapDisplayer()) // default 
       .handler(new Handler()) // default 
       .build(); 
     imageLoader = ImageLoader.getInstance(); 

4.)on your adapter write this: 

    imageLoader.displayImage(alist.get(position).getThumbnails(), 
        holder.ivImage, options, null); // alist.get(position).getThumbnails() is the url of the thumbnail and holder.ivImage is the reference of the imageview where thumbnail is to be placed 
+0

Мой прокрутка выполняется быстро, но требуется время для загрузки адаптера. – Marcus

+0

Lazyloading также поможет быстро загрузить адаптер. –

+0

Если я хотел бы реализовать это сам, не могли бы вы указать мне в правильном направлении? – Marcus

Смежные вопросы