【问题标题】:Android bindingadapter not updating valueAndroid bindingadapter不更新值
【发布时间】:2019-03-06 09:28:18
【问题描述】:

我正在尝试使用绑定适配器在 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”不再被调用。

【问题讨论】:

  • 我调试 viewModel,所以首先调用了“setProfilePicture”,但是当我 setImageUrl 时,没有再次调用“setProfilePicture”。
  • 是的,我试过了,即使我调用 imageUrl.set("new value")。在绑定中有一个方法“onChangeVmImageUrl”没有被调用。

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


【解决方案1】:

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

notifyPropertyChanged(int fieldId) 做什么?

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

查看here的更多信息

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    相关资源
    最近更新 更多