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

时间:2018-06-15 04:56:38

标签: android android-databinding android-glide

我正在努力学习DataBinding并坚持一个问题。在使用GLide加载图像时,我无法显示进度。以下是我的代码。

 @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绑定以加载图片?

1 个答案:

答案 0 :(得分:2)

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

<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}" />

希望这有帮助!