Связывающий адаптер Android не обновляет значение - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь использовать привязывающий адаптер для установки URL-адреса изображения в «imageView» с помощью Picasso.

My XML Image View:

  <ImageView
                        android:id="@+id/imgProfile"
                        android:layout_width="match_parent"
                        android:layout_height="110dp"
                        android:background="@color/transparent"
                        android:padding="5dp"
                        bind:imgUrl="@{vm.imageUrl}"
                        android:scaleType="fitCenter"
                        android:translationZ="5dp" />

My ViewModel:

  public ObservableField<String> getImageUrl() {
    return imageUrl;
}

private ObservableField<String> imageUrl = new ObservableField<>();


@BindingAdapter({"bind:imgUrl"})
public static void setProfilePicture(ImageView imageView, String imgUrl) {
    if (imgUrl == null) {
        Picasso.get().load(R.drawable.ic_registration_logo).into(imageView);
    } else
        Picasso.get().load(imgUrl).placeholder(R.drawable.ic_registration_logo).into(imageView);
}

Теперь при запуске вызывается «setProfilePicture» и устанавливается изображение по умолчанию.Затем я делаю вызов API, чтобы получить URL изображения при успешном использовании API. Я устанавливаю значение «imageUrl»

  imageUrl.set("URL RECEIVED FROM SERVER");

Это не обновляется при просмотре.Означает, что setProfilePicture больше не вызывается.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Я уже использую ObservableField, когда я устанавливаю значение ObservableField, оно автоматически вызывает notifyChange

Да, вам не нужно уведомлять, когда вы используете ObservableField.

Я только что проверил это, и оно отлично работает .Потому что я не вижу весь ваш код, поэтому я не могу сказать, где проблема.

Я использовал Handler.postDelayed(), который будет вести себя как вызов API.

activity_main.xml

<variable
    name="item"
    type="com.innovanathinklabs.sample.data.Image"/>

<ImageView
    android:layout_width="50dp"
    android:layout_height="50dp"
    bind:imgUrl="@{item.url}"/>

Image.java

public class Image {
    private ObservableField<String> url = new ObservableField<>();

    public ObservableField<String> getUrl() {
        return url;
    }

    public void setUrl(ObservableField<String> url) {
        this.url = url;
    }

    @BindingAdapter({"bind:imgUrl"})
    public static void setProfilePicture(ImageView imageView, String imgUrl) {
        Picasso.get().load(imgUrl).placeholder(R.drawable.ic_sync).into(imageView);
    }
}

ActivityMain.java

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
final String URL_1 = "https://sftextures.com/texture/2704/0/2703/wallpaper-pattern-primitives-shades-of-grey-smaller-details-abstract-huge-texture-256x256.jpg";
final String URL_2 = "https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Breathe-preferences-desktop-wallpaper.svg/128px-Breathe-preferences-desktop-wallpaper.svg.png";
Image item = new Image();
item.getUrl().set(URL_1);
binding.setItem(item);
new Handler().postDelayed(() -> binding.getItem().getUrl().set(URL_2), 4000);

Предложение

Зачем создавать много пространств имен?Просто используйте существующее пространство имен.

@BindingAdapter({"android:src"})

и

android:src="@{item.url}"
0 голосов
/ 01 октября 2018

Вам нужно вызвать notifyPropertyChanged(BR.imageUrl) после изменения значения.

Что notifyPropertyChanged (int fieldId) делает?

Уведомляет слушателей, что определенное свойство имеетизменилось.Получатель для свойства, которое изменяется, должен быть помечен Bindable, чтобы сгенерировать поле в BR для использования в качестве fieldId.

Проверьте дополнительную информацию из здесь

...