【问题标题】:Circular progress bar as Glide Placeholder圆形进度条作为 Glide 占位符
【发布时间】:2018-08-01 12:30:49
【问题描述】:

我正在通过滑行显示来自服务器的图像。 我想显示一个圆形进度条作为占位符。我从progress-bar-while-loading-image-using-glide 尝试了这种方法,但它不起作用。 我错过了什么?

我正在展示活动中的回收者视图。当用户单击 onItem 时,图像会在包含 Viewpager 的片段中打开。我正在通过滑动在 viewpager 中加载图像。

适配器类 -

public class MyViewPagerAdapter extends PagerAdapter {
private ArrayList<Object> imagesList = new ArrayList<>();
public MyViewPagerAdapter(ArrayList<Object> images) {
    this.imagesList = images;
}

@NonNull
@SuppressLint("ClickableViewAccessibility")
@Override
public Object instantiateItem(@NonNull final ViewGroup container, int position) {
    Object recyclerViewItem = imagesList.get(position);
    final View view = LayoutInflater.from(container.getContext()).inflate(R.layout.util_image_fullscreen_preview, container, false);
    final TouchImageView imageViewPreview = view.findViewById(R.id.image_preview);
   CircularProgressDrawable circularProgressDrawable = 
                new CircularProgressDrawable(container.getContext());
circularProgressDrawable.start();

        Photos image = (Photos) imagesList.get(position);
        GlideApp
            .with(container.getContext())
            .asBitmap()
            .load(advertiser.getUrl())
            .placeholder(circularProgressDrawable)
            .fitCenter().diskCacheStrategy(DiskCacheStrategy.ALL)
            .into(imageViewPreview);


    container.addView(view);
    return view;

}

@Override
public int getCount() {
    return imagesList.size();

}


@Override
public boolean isViewFromObject(View view, Object obj) {
    return view.equals(obj);
}


@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView((View) object);
}

}

【问题讨论】:

  • 你试过用 gif 代替吗?
  • @ThankgodRichard 是的,但是如果我使用 gif,则必须开始一个新问题 - 如何在 Glide 中设置 gif 的高度和宽度?
  • 当您只显示 .jpeg 格式的图像时,为什么需要使用 GIF

标签: android xml progress-bar android-imageview android-glide


【解决方案1】:

在视图寻呼机中,您可以在实例化方法中使用以下方法。第一种方法是加载gif图像,第二种方法是简单的带有进度条的图像加载。

////  for loading gif images 
RequestOptions requestOptions = new RequestOptions();
        requestOptions.diskCacheStrategy(DiskCacheStrategy.ALL);
        requestOptions.placeholder(R.drawable.itemes_bg);
        requestOptions.error(R.drawable.itemes_bg);


 Glide.with(context).applyDefaultRequestOptions(requestOptions).asGif().load(gifList.get(position)).listener(new RequestListener<GifDrawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
                     
                        Toast.makeText(context, "No Internet Connection...", Toast.LENGTH_SHORT).show();
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {

                        return false;
                    }
                }).into(holder.imageView);

////  for loading simple images

	RequestOptions requestOptions = new RequestOptions();
        requestOptions.diskCacheStrategy(DiskCacheStrategy.ALL);
        requestOptions.placeholder(R.drawable.progress);

        Glide.with(activity).applyDefaultRequestOptions(requestOptions).load(imageList.get(position).getImgUrl().trim()).listener(new RequestListener<Drawable>() {
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                progressBar.setVisibility(View.GONE);
                Toast.makeText(activity, "No Internet Connection", Toast.LENGTH_SHORT).show();
                return false;
            }

            @Override
            public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                progressBar.setVisibility(View.GONE);
                return false;
            }
        }).into(imageView);

请记住,您必须在 xml 中添加以下代码

<ProgressBar
        android:id="@+id/progBar"
        android:padding="150dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="visible" />

【讨论】:

    【解决方案2】:

    试试这个解决方案

    在您的xml.file 中添加进度条

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <ProgressBar
            android:id="@+id/progress"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:visibility="visible" />
    
        <ImageView
            android:id="@+id/imageView"
            android:layout_width="match_parent"
            android:layout_height="100dp" />
    
    </RelativeLayout>
    

    为 Glide 导入 gradle

    compile 'com.github.bumptech.glide:glide:3.7.0'
    

    然后

     final ProgressBar progressBar = (ProgressBar) 
         findViewById(R.id.progress);
        progressBar.setVisibility(View.VISIBLE);
           Glide.with(contexthere).load(advertiser.getUrl())
                                .diskCacheStrategy(DiskCacheStrategy.ALL)
                                .into(new SimpleTarget<GlideDrawable>() {
                                    @Override
                                    public void onResourceReady(GlideDrawable glideDrawable, GlideAnimation<? super GlideDrawable> glideAnimation) {
                                       progressBar.setVisibility(View.GONE);
                                        imageViewPreview.setImageDrawable(glideDrawable);
                                    }
                                });
    

    注意:- 传递正确的上下文,即在片段类中使用 getActivity() 并在活动类中使用 ActivityName.this

    【讨论】:

    • 我在 ViewPagerAdapter 中使用它。
    • 然后传递你在寻呼适配器的构造函数中得到的上下文
    • 你试过这个解决方案了吗?
    • 编辑了我的答案,请检查并使用,如果不起作用,请告诉我:)
    • 问题是当我使用这段代码时。只有微调器显示没有任何图像。还在框架布局中尝试过。但没用。
    【解决方案3】:

    试试这个方法

    在 layout.xml 中

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
    <ProgressBar
        android:id="@+id/progrss"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />
    
    </RelativeLayout>
    

    现在你加载图片的位置,

    prgress = (ProgressBar)findViewById(R.id.progress);
    progress.setVisibility(View.VISIBLE);
    Glide.with(mContext)
                .load(imageUrl)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(new SimpleTarget<GlideDrawable>() {
                    @Override
                    public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
    
                        progress.setVisibility(View.GONE);    
                        imageViewPriview.setImageDrawable(resource);
                    }
    
                    @Override
                    public void onLoadFailed(Exception e, Drawable errorDrawable) {
                         progress.setVisibility(View.GONE);
                    }
                });
    

    【讨论】:

    • 也试过了,但是图片没有加载,只是进度条在移动。
    • 两种方法都有隐藏进度条吗?即准备好和失败
    • 在 ResourceReady 和 Failed 中隐藏进度条。
    • 此方法在 RecycleViewAdapter 中有效,但在 ViewPagerAdapter 中无效
    • 你只是复制我的答案并粘贴在这里,提供不同的解决方案,否则很快会被版主删除
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2022-01-17
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多