簡體   English   中英

帶滑行的回收器視圖

[英]Recycler view with glide

我面臨給定代碼的以下問題:

  1. 當我回滾 recyclerview 時重新加載圖像
  2. 加載了錯誤的縮略圖(當我來回滾動時它們會不斷變化)
  3. 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 語句替換時,錯誤的縮略圖問題解決了

(如果有人解釋原因會很有用)

Glide.with(mContext)
          .load(coverpicture(videoFiles.get(position).getPath()))
                                .diskCacheStrategy(DiskCacheStrategy.ALL)
                                .placeholder(circularProgressDrawable)
                                .into(new DrawableImageViewTarget(holder.thumbnail));
  1. 在 recyclerview 適配器的onBindViewHolder 中,在后台線程中,首先加載滑動圖像。然后使用view.post顯示它
    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 . 帖子里已經提到了

3 . 封面圖片()更改為

   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;
        }
    }

不需要在coverpicture()內部穿線,因為它是從后台線程調用的

此外,recyclerview 中的以下優化將有所幫助

recyclerView.setHasFixedSize(true);
recyclerView.setItemViewCacheSize(20);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM