2

我正在尝试在 Picasso 的帮助下使用绑定适配器在“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" />

我的视图模型:

  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 调用以在 API 成功时获取图像的 URL 我将值设置为“imageUrl”

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

它不会在视图中更新。意味着“setProfilePicture”不再被调用。

4

2 回答 2

0

您需要notifyPropertyChanged(BR.imageUrl)在更改值后调用。

notifyPropertyChanged(int fieldId)有什么作用?

通知侦听器特定属性已更改。应标记更改的属性的 getter 以在BRBindable中生成一个用作 fieldId 的字段。

从这里查看更多信息

于 2018-10-01T09:56:31.880 回答
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}"/>

图像.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}"
于 2018-10-03T09:48:09.130 回答