在我的Android应用程序中,我需要在SD卡上的目录中显示视频的缩略图。我使用以下代码创建缩略图:
Bitmap bm = ThumbnailUtils.createVideoThumbnail(list.get(position).getPath()
.substring(8, list.get(position).getPath().length()), MediaStore.Images.Thumbnails.MINI_KIND);
需要时间来创建缩略图。如果我在异步类中执行它,列表的位置会重复并显示错误的缩略图。
我该如何管理?
编辑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);
}
}
编辑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 :(得分:1)
这是我建议的方法。
从CreateThumbnail
方法中调用getView
方法。您必须将index
传递给AsyncTask
。
在处理缩略图和内部onPostExecute
方法后,
获取代表传递的索引的View
。您可以使用this链接了解如何使用listView
从index
获取视图。
现在您可以将图像设置为您引用的imageView
。
但是,请注意仅在列表视图索引可见时才更新。
此外,当用户滚动并且索引项目滚动显示可见部分时,您可能需要取消AsyncTask
。否则,您可能会继续执行太多后台任务。
答案 1 :(得分:0)
在列表完成写入后,您是否在异步代码中创建了列表副本?
如果不是(并且您的异步任务是保留对原始列表的引用),也许异步处理在完全填充(可能是目录内容)列表之前开始?
没有更多的代码就很难分辨。