Android-адаптер привязки не обновляет значение

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

Мое представление изображения XML:

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

Моя модель просмотра:

  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 больше не вызывается.


person Shivam    schedule 01.10.2018    source источник
comment
Я отлаживаю viewModel, поэтому вызывается самый первый setProfilePicture, но когда я setImageUrl, setProfilePicture больше не вызывается.   -  person Shivam    schedule 01.10.2018
comment
Да, я пробовал, даже вызываю imageUrl.set (новое значение). В привязке есть метод onChangeVmImageUrl, который не вызывается.   -  person Shivam    schedule 01.10.2018


Ответы (2)


После изменения значения необходимо вызвать notifyPropertyChanged(BR.imageUrl).

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

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

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

person Jeel Vankhede    schedule 01.10.2018
comment
Я уже использую ObservableField, когда я устанавливаю значение ObservableField, он автоматически вызывает notifyChange - person Shivam; 01.10.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}"
person Khemraj Sharma    schedule 03.10.2018