当从 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),但布局未在运行时更新。我试过使用 LiveDataMutableLiveData,但它们似乎效果不佳。我也尝试使用 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
        }
    }