我在给定的代码中遇到以下问题:
当我向后滚动recyclerview时图像会重新加载
加载了错误的缩略图(当我来回滚动时,它们会不断变化)
ui挂起(我尝试线程,但问题仍然存在)
这些问题不适用于视频文件(外部if的其他部分)
内置视频适配器:
if(videoFiles.get(position).getType().equals(MediaStore.Files.FileColumns.MEDIA_TYPE_AUDIO+"")){
if(coverpicture(videoFiles.get(position).getPath())!=null) {
Glide.with(mContext)
.load(coverpicture(videoFiles.get(position).getPath()))
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(circularProgressDrawable)
.into(holder.thumbnail);
}
else {
Glide.with(mContext)
.load(new File(videoFiles.get(position).getPath()))
.placeholder(R.drawable.ic_baseline_music_note)
.into(holder.thumbnail);
}
} else {
Glide.with(mContext)
.load(new File(videoFiles.get(position).getPath()))
.placeholder(circularProgressDrawable)
.into(holder.thumbnail);
}
我这样称呼视频适配器:
videoAdapter = new VideoAdapter(getActivity(),videoFiles);
功能封面图片:
private Bitmap coverpicture(String path) {
final MediaMetadataRetriever[] mr = new MediaMetadataRetriever[1];
final byte[][] byte1 = new byte[1][1];
Thread ttt = new Thread(){
@Override
public void run() {
super.run();
mr[0] = new MediaMetadataRetriever();
mr[0].setDataSource(path);
byte1[0] = mr[0].getEmbeddedPicture();
mr[0].release();
}
};
ttt.start();
while(true){
if(!ttt.isAlive()){
if(byte1[0] != null) {
return BitmapFactory.decodeByteArray(byte1[0], 0, byte1[0].length);
}
else {
return null;
}
}
}
}
编辑:错误的缩略图问题解决了,当我取代第一个滑动语句
(如果有人解释一下原因会很有用)
Glide.with(mContext)
.load(coverpicture(videoFiles.get(position).getPath()))
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(circularProgressDrawable)
.into(new DrawableImageViewTarget(holder.thumbnail));
1条答案
按热度按时间iyfamqjs1#
在recyclerview适配器的onbindviewholder中,在后台线程中,首先加载滑动图像,然后使用view.post显示它
2 . 已经在帖子里提到了
三。将coverpicture()更改为
不需要在coverpicture()内部线程,因为它是从后台线程调用的
此外,recyclerview中的以下优化也会有所帮助