在 DataBinding 中使用 Glide 加载图像时显示进度条

Show progress Bar when loading image with Glide in DataBinding

我正在努力学习 DataBinding,但遇到了一个问题。在使用 GLide 加载图像期间,我无法显示 Progress 。下面是我的代码。

 @BindingAdapter("android:src")
public static void loadImage(ImageView view, String url){
    if(!TextUtils.isEmpty(url))
    Glide.with(view).load(url).into(view);
}


   @BindingAdapter({"android:src","progressBar"})
public static void loadImage(ImageView view, String url, ProgressBar progressBar){
    if(!TextUtils.isEmpty(url))
        Glide.with(view).load(url)
                .listener(new RequestListener<Drawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                        return false;
                    }
                    @Override
                    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                        progressBar.setVisibility(View.GONE);
                        return false;
                    }
                })
                .into(view);
}

我称它为:

 @Override
public Object instantiateItem(ViewGroup container, final int position) {
    LayoutInflater lp = LayoutInflater.from(container.getContext());
    ItemImageSliderBinding itemBinding = ItemImageSliderBinding.inflate(lp, container, false);
    container.addView(itemBinding.getRoot());
    itemBinding.setImageUrl(images.get(position));
    itemBinding.executePendingBindings();
    return itemBinding.getRoot();
}

如您所见,有两个重载方法loadImage但我想使用第二个来显示进度。我怎样才能做到这一点 。可能还有其他一些优雅的方法可以做到这一点。但我不知道它是什么。目前我的布局如下所示。

<layout>
<data>
    <variable
        name="imageUrl"
        type="String" />
</data>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@{imageUrl}" />
    <ProgressBar
        android:id="@+id/progressImageSlider"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        />
</LinearLayout>

如何将 ProgressBarBindingAdapter 绑定以加载图像?

如果您想使用第二种方法:

<ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:progressBar="@{progressImageSlider}"
        android:src="@{imageUrl}" />

但我认为你应该在这种情况下使用占位符,请参阅我的示例

@BindingAdapter(value = { "android:src", "placeholder" }, requireAll = false)
public static void loadImage(ImageView view, String url, Drawable placeHolder) {
    if (!TextUtils.isEmpty(url)) {
        Glide.with(view.getContext()).load(url).placeholder(placeHolder).into(view);
    }
}

并在您的 xml

中调用它
<ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:placeholder="@{@drawable/your_place_holder}"
        android:src="@{imageUrl}" />

希望这对您有所帮助!