语境:
我正在使用新数据绑定库的 v1.0-rc1 。
我有以下视图模型:
public class DrawerPageHeaderViewModelImpl extends BaseObservable implements DrawerPageHeaderViewModel {
@Nullable
private Location currentLocation;
public DrawerPageHeaderViewModelImpl(@Nullable final Location currentLocation) {
this.currentLocation = currentLocation;
}
@Bindable
@Nullable
@Override
public String getDistanceDisplayString() {
if (currentLocation == null) {
return null;
}
float[] results = new float[1];
Location.distanceBetween(landmark.getLatitude(), landmark.getLongitude(), currentLocation.getLatitude(), currentLocation.getLongitude(), results);
final float metersToTargetLocation = results[0];
final float feetToTargetLocation = DistanceUtil.convertMetersToFeet(metersToTargetLocation);
return DistanceUtil.convertFeetToFeetOrMilesString(feetToTargetLocation);
}
@Override
public void setCurrentLocation(@Nullable final Location currentLocation) {
this.currentLocation = currentLocation;
notifyPropertyChanged(BR.distanceDisplayString);
}
}
此视图模型被传递给 aFragment
并存储在实例变量中。然后视图模型在 Fragment 的onCreateView
回调中绑定到一个布局(这里headerView
是一个空的FrameLayout
):
@Nullable
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
final View v = inflater.inflate(R.layout.fragment_drawer_page, container, false);
headerView = (ViewGroup) v.findViewById(R.id.headerView);
final ViewDrawerPageHeaderBinding binding = DataBindingUtil.inflate(inflater, R.layout.view_drawer_page_header, headerView, true);
binding.setViewModel(viewModel);
return v;
}
周期性地,viewModel.setCurrentLocation
被调用并传递用户的当前位置:
@Override
public void update(final Observable observable, Object data) {
new Handler(Looper.getMainLooper()).post(() -> {
if (isAdded()) {
viewModel.setCurrentLocation(locationController.getCachedUserLocation());
}
});
}
当前行为:
首次创建String
时,UI 会正确显示距离。每次重新创建 a 时Fragment
,UI 都会正确显示距离(这些片段位于.String
Fragment
ViewPager
viewModel.setCurrentLocation
使用新位置调用时,UI 不会更新。
期望的行为:
每次viewModel.setCurrentLocation
使用新位置调用 UI 都会更新。
到目前为止我看过/想过的东西:
据我所知,实现视图模型Observable
(在这种情况下,通过扩展BaseObservable
)应该会在notifyPropertyChanged
调用时自动更新 UI。至少,当我查看数据绑定的 Android 文档时,这是我带走的信息。
该类BaseObservable
维护一个私有列表OnPropertyChangedCallback
s。如果我在方法上设置调试断点BaseObservable.notifyPropertyChanged
:
public void notifyPropertyChanged(int fieldId) {
if(this.mCallbacks != null) {
this.mCallbacks.notifyCallbacks(this, fieldId, (Object)null);
}
}
我看到那mCallbacks
总是null
在运行时。所以大概,生成的数据绑定的东西不会调用BaseObservable.addOnPropertyChangedCallback
来提供OnPropertyChangedCallback
自动连接组件的。这是否意味着我需要手动完成?这似乎违背了数据绑定库的很多要点。