我试图在毕加索的帮助下使用绑定适配器在“ 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”不再被调用。
答案 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}"