当从 onCreate() 以外的方法调用 setter 时,ViewModel 不会在布局中更新
ViewModel does not get updated in the layout when setters are called from method other than onCreate()
我有一个名为 MyInfoModel
的 class,其中包含一些实例变量来存储有关用户的数据,以及一种通知观察者 class 的方法。
private final List<ObserverInterface> observers = new ArrayList<>();
private int id;
private String name;
private String imageURL;
// Getters, Setters, Register and Unregister Methods for Instance Variables
// Also All Setter Methods call the notifyObservers() method after setting the values
private void notifyObservers(){
Log.d(this.getClass().getName(), "Notifying All Observers");
for (ObserverInterface observer : observers){
observer.updateViews();
}
}
我有一个接口 ObserverInterface
,它只有一个方法 void updateViews();
,它被其他实现此接口的 class 覆盖。
我正在使用 Retrofit 请求一些数据,这些数据在常量 class.
的静态对象中更新
public class Constants {
public static MyInfoModel INFO_CONSTANTS = new MyInfoModel();
}
此外,我有一个视图模型 MainActivityViewModel
扩展了 ViewModel
class 并且有变量、getter 和 setter 来支持 activity 的布局。
private int id;
private String name;
private String imageURL;
// Getters and Setters
我在这样的布局中使用了 DataBinding
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="com.itsyourap.app.viewModel.MainActivityViewModel" />
</data>
<TextView <!-- Layout Tags -->
android:text="@{viewModel.Name}" />
然后我有 MainActivity
,我想等待 Constants.INFO_CONSTANTS
变量值的任何变化,所以我实现了 ObserverInterface
接口并覆盖 [=23] =] 方法是这样的:-
public class MainActivity extends AppCompatActivity implements ObserverInterface {
private MainViewModel mainViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mainViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
mainBinding.setViewModel(mainViewModel);
mainBinding.getViewModel().setName("Alpha Beta Gamma"); // Works
mainBinding.getViewModel().setImageURL("somelink.jpg"); // Works
}
public MainActivity(){
Constants.INFO_CONSTANTS.register(this);
}
@Override
public void updateViews() {
if (mainViewModel != null){
Log.d(this.getClass().getName(), "Updating Views");
mainViewModel.setName(Constants.INFO_CONSTANTS.getName()); // Does Not Work
mainViewModel.setImageURL(Constants.INFO_CONSTANTS.getImageURL()); // Does Not Work
}
}
}
我面临的问题是 updateViews()
已成功调用(根据 LogCat),但布局未在运行时更新。我试过使用 LiveData
和 MutableLiveData
,但它们似乎效果不佳。我也尝试使用 mainBinding.setLifecycleOwner(this);
,但效果不佳。
也可以从 onCreate()
方法中调用 setter,但在 updateViews()
方法中不起作用。
我应该如何让它发挥作用?我只希望布局中的值在 ViewModel 中的值更改后立即更改。
提前致谢
修改变量后调用setViewModel()
解决问题
@Override
public void updateViews() {
if (mainViewModel != null){
Log.d(this.getClass().getName(), "Updating Views");
mainViewModel.setName(Constants.INFO_CONSTANTS.getName());
mainViewModel.setImageURL(Constants.INFO_CONSTANTS.getImageURL());
mainBinding.setViewModel(mainViewModel); // Solves The Problem
}
}
我有一个名为 MyInfoModel
的 class,其中包含一些实例变量来存储有关用户的数据,以及一种通知观察者 class 的方法。
private final List<ObserverInterface> observers = new ArrayList<>();
private int id;
private String name;
private String imageURL;
// Getters, Setters, Register and Unregister Methods for Instance Variables
// Also All Setter Methods call the notifyObservers() method after setting the values
private void notifyObservers(){
Log.d(this.getClass().getName(), "Notifying All Observers");
for (ObserverInterface observer : observers){
observer.updateViews();
}
}
我有一个接口 ObserverInterface
,它只有一个方法 void updateViews();
,它被其他实现此接口的 class 覆盖。
我正在使用 Retrofit 请求一些数据,这些数据在常量 class.
的静态对象中更新public class Constants {
public static MyInfoModel INFO_CONSTANTS = new MyInfoModel();
}
此外,我有一个视图模型 MainActivityViewModel
扩展了 ViewModel
class 并且有变量、getter 和 setter 来支持 activity 的布局。
private int id;
private String name;
private String imageURL;
// Getters and Setters
我在这样的布局中使用了 DataBinding
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="com.itsyourap.app.viewModel.MainActivityViewModel" />
</data>
<TextView <!-- Layout Tags -->
android:text="@{viewModel.Name}" />
然后我有 MainActivity
,我想等待 Constants.INFO_CONSTANTS
变量值的任何变化,所以我实现了 ObserverInterface
接口并覆盖 [=23] =] 方法是这样的:-
public class MainActivity extends AppCompatActivity implements ObserverInterface {
private MainViewModel mainViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mainViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
mainBinding.setViewModel(mainViewModel);
mainBinding.getViewModel().setName("Alpha Beta Gamma"); // Works
mainBinding.getViewModel().setImageURL("somelink.jpg"); // Works
}
public MainActivity(){
Constants.INFO_CONSTANTS.register(this);
}
@Override
public void updateViews() {
if (mainViewModel != null){
Log.d(this.getClass().getName(), "Updating Views");
mainViewModel.setName(Constants.INFO_CONSTANTS.getName()); // Does Not Work
mainViewModel.setImageURL(Constants.INFO_CONSTANTS.getImageURL()); // Does Not Work
}
}
}
我面临的问题是 updateViews()
已成功调用(根据 LogCat),但布局未在运行时更新。我试过使用 LiveData
和 MutableLiveData
,但它们似乎效果不佳。我也尝试使用 mainBinding.setLifecycleOwner(this);
,但效果不佳。
也可以从 onCreate()
方法中调用 setter,但在 updateViews()
方法中不起作用。
我应该如何让它发挥作用?我只希望布局中的值在 ViewModel 中的值更改后立即更改。
提前致谢
修改变量后调用setViewModel()
解决问题
@Override
public void updateViews() {
if (mainViewModel != null){
Log.d(this.getClass().getName(), "Updating Views");
mainViewModel.setName(Constants.INFO_CONSTANTS.getName());
mainViewModel.setImageURL(Constants.INFO_CONSTANTS.getImageURL());
mainBinding.setViewModel(mainViewModel); // Solves The Problem
}
}