Android bindingadapter未更新值

时间:2018-10-01 09:37:19

标签: android mvvm data-binding android-databinding android-mvvm

我试图在毕加索的帮助下使用绑定适配器在“ imageView”中设置图像URL。

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

我的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 :(得分:0)

更改值后,您需要致电notifyPropertyChanged(BR.imageUrl)

  

notifyPropertyChanged(int fieldId)的作用是什么?

     

通知侦听器特定属性已更改。吸气剂   对于应该用Bindable标记的更改的属性   在 BR 中生成一个字段,用作fieldId。

here

查看更多信息

答案 1 :(得分:0)

  

设置值的时候我已经在使用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}"