简体   繁体   English

来自Android Mediastore的懒惰缩略图视频

[英]Lazy thumbnails video from Android Mediastore

I'm showing a video list with title, duration and thumb image of the media file. 我正在显示一个视频列表,其中包含媒体文件的标题,时长和缩略图。 Since I don't want to use the fixed thumbnails size (eg: MediaStore.Video.Thumbnails.MICRO_KIND or MediaStore.Video.Thumbnails.MINI_KIND), I've decided to get the thumb URI by myself with: 由于我不想使用固定的缩略图大小(例如:MediaStore.Video.Thumbnails.MICRO_KIND或MediaStore.Video.Thumbnails.MINI_KIND),因此,我决定自己通过以下方式获取拇指URI:

thumbUri = videoThumbnailCursor.getString(videoThumbnailCursor.getColumnIndex(MediaStore.Video.Thumbnails.DATA));

All works fine, except that the thumbnails of the new added video in the MediaStore not appear immediately but only when the View begins to scroll. 一切工作正常,除了MediaStore中新添加的视频的缩略图不会立即显示,而是仅在View开始滚动时才显示。

This is the getView code: 这是getView代码:

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

            ViewHolder holder;
            String id = null;
            if (convertView == null) {
                convertView = LayoutInflater.from(vContext).inflate(
                        R.layout.listitem, parent, false);
            }
                holder = new ViewHolder();

                holder.txtTitle = (TextView) convertView
                        .findViewById(R.id.txtTitle);

                holder.txtDuration = (TextView) convertView
                        .findViewById(R.id.duration)

                holder.thumbImage = (ImageView) convertView
                        .findViewById(R.id.imgIcon);

                video_column_index = videocursor
                        .getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME);
                videocursor.moveToPosition(position);
                id = videocursor.getString(video_column_index);

                video_column_index = videocursor
                        .getColumnIndexOrThrow(MediaStore.Video.Media.DURATION);
                videocursor.moveToPosition(position);

                long duration  = videocursor.getLong(video_column_index);

                holder.txtTitle.setText(R.string.listedvideo_text);

                String converted = "";


                if(duration != 0) {

                converted = String.format(Locale.ITALIAN, "%02d:%02d", 
                        TimeUnit.MILLISECONDS.toMinutes(duration),
                        TimeUnit.MILLISECONDS.toSeconds(duration) - 
                        TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration))
                    );

                holder.txtDuration.setText(converted);

                }

                String[] proj = { MediaStore.Video.Media._ID,
                        MediaStore.Video.Media.DISPLAY_NAME,
                        MediaStore.Video.Media.DATA };
                @SuppressWarnings("deprecation")
                Cursor cursor = managedQuery(
                        MediaStore.Video.Media.EXTERNAL_CONTENT_URI, proj,
                        MediaStore.Video.Media.DISPLAY_NAME + "=?",
                        new String[] { id }, null);

                long ids = videocursor.getLong(videocursor.getColumnIndex(MediaStore.Video.Media._ID));

                int videoId = videocursor.getInt(videocursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));

                Cursor videoThumbnailCursor = getContentResolver().query(MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI,
                        thumbColumns, MediaStore.Video.Thumbnails.VIDEO_ID+ "=" + videoId, null, null);

                String thumbUri = "";
                if (videoThumbnailCursor.moveToFirst()) {
                    thumbUri = videoThumbnailCursor.getString(videoThumbnailCursor.getColumnIndex(MediaStore.Video.Thumbnails.DATA));
                }

                ContentResolver crThumb = getContentResolver();
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 1;

                holder.thumbImage.setImageURI(Uri.parse(thumbUri));


                duration = 0;

            return convertView;
        }
    }

You missed the whole point of ViewHolder as you create new instances of it every call to the getView(). 在每次调用getView()时都创建ViewHolder的新实例时,您会错过整个问题。 You need to create instance per View creation: 您需要通过创建View来创建实例:

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

    ViewHolder holder;
    String id = null;
    if (convertView == null) {
        convertView = LayoutInflater.from(vContext).inflate(
                R.layout.listitem, parent, false);
        holder = new ViewHolder();

        holder.txtTitle = (TextView) convertView
                .findViewById(R.id.txtTitle);

        holder.txtDuration = (TextView) convertView
                .findViewById(R.id.duration)

        holder.thumbImage = (ImageView) convertView
                .findViewById(R.id.imgIcon);
        convertView.setTag(holder);

    } else
        holder = (ViewHolder)convertView.getTag();

   //rest of code

    return convertView;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM