[英]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.