【问题标题】:Download all the images before displaying it in recyclerview在recyclerview中显示之前下载所有图像
【发布时间】:2017-09-06 08:50:43
【问题描述】:

我有一个RecyclerView,我将在其中展示 9 张图片。所有这些图像都在服务器上。我正在使用Glide 下载适配器的onBindViewHolder 中的图像。问题是如果互联网速度比 Glide 慢,下载图像和显示需要时间。在它下载图像之前,我的 Recyclerview 是空的并且没有显示任何内容。我想显示Progressbar,直到所有图像都下载完毕。下载完所有图片后,Progressbar 将隐藏并显示所有 9 张图片。

这是我的适配器:

public class PuzzleGridAdapter extends RecyclerView.Adapter<PuzzleGridAdapter.MyViewHolder> implements ItemTouchHelperAdapter {
    List<String> itemList;
    LayoutInflater inflater;
    Context context;
    private final OnStartDragListener mDragStartListener;

    public PuzzleGridAdapter(Context context, OnStartDragListener dragStartListener) {
        this.context = context;
        mDragStartListener = dragStartListener;
        inflater = LayoutInflater.from(context);
        itemList = new ArrayList<>();
    }

    public void getItemList(List<String> nameList) {
        int currentSize = itemList.size();
        itemList.clear();
        itemList.addAll(nameList);
        notifyItemRangeRemoved(0, currentSize);
        notifyItemRangeInserted(0, nameList.size());
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.custom_puzzle_row, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
        Log.e("PuzzleGridAdapter", itemList.get(position));

//        holder.textView.setTag(itemList.get(position));
//        new DownloadTask().execute(holder.textView);
        Glide.with(context).load(itemList.get(position)).asBitmap().override(200,200).listener(new RequestListener<String, Bitmap>() {
            @Override
            public boolean onException(Exception e, String model, Target<Bitmap> target, boolean isFirstResource) {
                Log.e("PuzzleGridAdapter", e.getMessage());
                return false;
            }

            @Override
            public boolean onResourceReady(Bitmap resource, String model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
                Log.e("PuzzleGridAdapter", "ready");
                return false;
            }
        }).diskCacheStrategy(DiskCacheStrategy.RESULT).into(holder.textView);
        //holder.textView.setImageResource(itemList.get(position));
        // Start a drag whenever the handle view it touched
        holder.cardView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
                    mDragStartListener.onStartDrag(holder);
                }
                return false;
            }
        });
    }


    @Override
    public int getItemCount() {
        Log.e("PuzzleGridAdapter", itemList.size() + "");
        return itemList.size();
    }

    public List<String> getUpdateList() {
        return itemList;
    }

    @Override
    public boolean onItemMove(int fromPosition, int toPosition) {
        String item = itemList.remove(fromPosition);
        itemList.add(toPosition, item);
        notifyItemMoved(fromPosition, toPosition);
        return true;
    }

    @Override
    public void onItemDismiss(int position) {
        itemList.remove(position);
        notifyItemRemoved(position);
    }

    public class MyViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder {

        CardView cardView;
        ImageView textView;

        public MyViewHolder(View itemView) {
            super(itemView);
            cardView = (CardView) itemView.findViewById(R.id.gameCard);
            textView = (ImageView) itemView.findViewById(R.id.kolamImage);
        }

        @Override
        public void onItemSelected() {
            itemView.setBackgroundColor(Color.LTGRAY);
        }

        @Override
        public void onItemClear() {
            itemView.setBackgroundColor(Color.WHITE);
        }
    }
}

在下载所有内容之前如何显示Progressbar

【问题讨论】:

  • 而不是显示进度条。在每个图像上使用一个占位符,直到它被 Glide 加载。 Glide 提供了一种在加载图像之前使用占位符的方法,它还支持 GIF。它将使应用程序更具响应性,用户可以在加载之前播放,也可以按 tha anroid.R.id.home 按钮返回
  • 试试这个stackoverflow.com/a/35306315/5026709我希望它有帮助......
  • 对不起@RonnySulistio 我已经看到了。但我的问题是RecyclerView。这里我有多个ImageViews

标签: android android-recyclerview android-glide


【解决方案1】:

从示例 https://stackoverflow.com/questions/aa 中获取帮助并将这样的代码添加到适配器:

Glide.with(this)
            .load("https://www.wonderplugin.com/wp-content/plugins/wonderplugin-lightbox/images/demo-image0.jpg")
            .listener(new RequestListener<String, GlideDrawable>() {
                @Override
                public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                    progressBar.setVisibility(View.GONE);
                    return false;
                }

                @Override
                public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                    progressBar.setVisibility(View.GONE);
                    return false;
                }
            })
            .into(imageView);

在回收站视图项目的 Imageview 上添加进度条。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多