Адаптер привязки данных. Как получить вид по ссылке?
Я хочу указать ссылку на представление в качестве атрибута ImageView
@BindingAdapter(value = {"imageUrl", "progressView"}, requireAll = false)
public static void setImageUrl(ImageView imageView, String url, @IdRes int progressBar) {
Context context = imageView.getContext();
View progressView = imageView.getRootView().findViewById(progressBar);
progressView.setVisibility(View.VISIBLE);
Glide.with(context).load(url).listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
if (progressView!= null) {
progressView.setVisibility.setVisibility(View.GONE);
}
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
if (progressView!= null) {
progressView.setVisibility(View.GONE);
}
return false;
}
}).crossFade().into(imageView);
}
Однако мой прогресс прогресса является нулевым. Я пытался привести контекст к активности и findViewById
Кроме того, null. Другое решение - просто добавить индикатор прогресса под изображением, и при успешной загрузке его необходимо наложить на изображение.
3 ответа
Странно, что вы видите нулевой прогресс. Возможно, у вас его нет в макете?
В любом случае, вы можете сделать это вместо:
<ProgressBar android:id="@+id/progressBarView" .../>
<!-- other stuff -->
<ImageView app:progressView="@{progressBarView}" app:imageUrl="..." .../>
И в вашем BindingAdapter:
@BindingAdapter(value = {"imageUrl", "progressView"}, requireAll = false)
public static void setImageUrl(ImageView imageView, String url, ProgressBar progressBar) {
...
}
В моем примере я передаю идентификатор ScrollView в качестве параметра для BindingAdapter.
Это код макета:
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
app:fadeVisible="@{viewModel.shippingMethodsVisible}"
app:fadeScrollView="@{scrollView}">
И это код адаптеров Bindig, написанный на Kotlin:
@JvmStatic @BindingAdapter(value = ["fadeVisible", "fadeScrollView"], requireAll = false)
fun setFadeVisible(view: View, visible: Boolean, scrollView: ScrollView) {
...
@BindingAdapter "value" - это массив строк, поэтому попробуйте это:
@BindingAdapter(value = {"imageUrl", "progressViewId"}, requireAll = false)
public static void setImageUrl(ImageView imageView, String iamgeUrl, String progressViewStrId) {
int progressBarId = Integer.valueOf(progressViewStrId);
...
}