Me enfrento a los siguientes problemas con el código dado:
Estos problemas no están presentes para los archivos de video (de lo contrario, forman parte del if externo)
Adaptador de vídeo interior:
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); }
Así es como llamo videoadapter:
videoAdapter = new VideoAdapter(getActivity(),videoFiles);
La imagen de portada de la función:
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; } } } }
EDITAR: el problema de la miniatura incorrecta se resuelve cuando reemplazo la primera declaración de deslizamiento con
(sería útil que alguien explicara por qué)
Glide.with(mContext) .load(coverpicture(videoFiles.get(position).getPath())) .diskCacheStrategy(DiskCacheStrategy.ALL) .placeholder(circularProgressDrawable) .into(new DrawableImageViewTarget(holder.thumbnail));
new Thread(()->{ Bitmap b =coverpicture(videoFiles.get(position).getPath()); Glide.with(mContext).downloadOnly().load(b); holder.thumbnail.post(() -> { Glide.with(mContext).clear(holder.thumbnail); Glide.with(holder.thumbnail.getContext()) .load(new File(videoFiles.get(position).getPath())) .placeholder(circularProgressDrawable) .format(DecodeFormat.PREFER_RGB_565) .into(new DrawableImageViewTarget(holder.thumbnail)); } }).start();
2 . Ya mencionado en la publicación
3 . Se cambió la imagen de portada () a
static Bitmap coverpicture(String path) { MediaMetadataRetriever mr; byte[] byte1 = new byte[1]; mr = new MediaMetadataRetriever(); mr.setDataSource(path); try { byte1 = mr.getEmbeddedPicture(); mr.release(); }catch (Exception e){ e.printStackTrace(); } if(byte1 != null) { return BitmapFactory.decodeByteArray(byte1, 0, byte1.length); } else { return null; } }
No es necesario enhebrar dentro de la imagen de portada () , ya que se llama desde un hilo de fondo
TAMBIÉN, las siguientes opiniones optimistas en recyclerview ayudarán
recyclerView.setHasFixedSize(true); recyclerView.setItemViewCacheSize(20); recyclerView.setDrawingCacheEnabled(true); recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);