我的布局中有简单的 imageview,我有一个 api 给我一个图像 url。我在我的布局中集成了数据绑定(bind)。现在,在解析 api 之后,我通过此行设置模型 binding.setUserinfo(memberObj.getMemberdata());
现在我还有一个绑定(bind)适配器,其中编写了 imgurl 代码。现在,自定义绑定(bind)适配器在 Activity 开始时和解析 api 后调用两次。
现在想在api解析成功后通知UI
这是我的 xml activity_main.xml 代码:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data class="MainBinding">
<variable
name="userinfo"
type="com.myapplication.retrofit.pojo.ImgTest"/>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.myapplication.retrofit.MainActivity">
<ImageView
android:layout_width="250dp"
android:layout_height="250dp"
android:id="@+id/imageView"
app:image_url="@{userinfo.imgUrl}"
/>
</RelativeLayout>
</layout>
这是我的 Pojo:ImgTest.java
public class ImgTest extends BaseObservable {
String imgUrl;
@Bindable
public String getImgUrl() {
return imgUrl;
}
public void setImgUrl(String imgUrl) {
this.imgUrl = imgUrl;
notifyPropertyChanged(BR.imgUrl);
}
}
这是我的 CustomBinder.java
public class CustomBinders {
private static final String TAG = "CustomBinders";
@BindingAdapter({"image_url"})
public static void loadImageWithOUtProgressBar(ImageView view, String imageUrl){
Log.d(TAG, "before loadImageWithOUtProgressBar: "+imageUrl);
Log.d(TAG, "after loadImageWithOUtProgressBar: "+imageUrl);
Picasso.with(view.getContext())
.load(imageUrl)
.into(view);
}
}
这里是MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
RestManager mManager;
MainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
mManager = new RestManager();
Call<ResponseBody> getUserInfo = mManager.getService().getUserInfo("25","sell");
getUserInfo.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
int sc = response.code();
Log.d(TAG, "onResponse: "+sc);
if(response.isSuccessful())
{
ImgTest img = new ImgTest();
try {
String res = response.body().string();
JSONObject jobj = new JSONObject(res);
JSONObject obj = jobj.getJSONObject("memberdata");
String imgUrl = "";
imgUrl = obj.getString("prifile_picture");
img.setImgUrl(imgUrl);
binding.setUserinfo(img);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}
}
请告知如何解决此问题。提前致谢。
最佳答案
正如 Ravi 在评论中所说,它正在按预期工作。创建初始绑定(bind)后,应将值设置为原样。如果您没有设置任何内容,那么它们将被设置为空。
您可以通过显式告诉绑定(bind)不绑定(bind)来更改行为。添加 OnRebindCallback
到绑定(bind):
private OnRebindCallback<ActivityMainBinding> delayRebindCallback =
new OnRebindCallback<ActivityMainBinding>() {
@Override
public boolean onPreBind(ActivityMainBinding binding) {
return false;
}
};
// ... and then after creating the binding ...
binding.addOnRebindCallback(delayRebindCallback);
在您的 onResponse 中(假设它在 UI 线程上):
binding.removeOnRebindCallback(delayRebindCallback);
binding.setUserinfo(img);
binding.executePendingBindings();
如果它不在 UI 线程上,您将必须发布可执行文件以在 UI 线程上运行 binding.executePendingBindings()
。
关于java - Android数据绑定(bind)问题绑定(bind)适配器调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39368592/