当我从MainActivity更新LoginViewModel中的User属性时,我的UI不变。(此问题停留了2天,找不到解决方案)
我的User类扩展了BaseObservable(添加了@Bindable和notifyPropertyChanged()),但是我不知道该怎么办。
这些是类:
用户:
public class User extends BaseObservable {
protected String userName;
protected String lastName;
public User(String userName, String lastName) {
this.userName = userName;
this.lastName = lastName;
notifyPropertyChanged(BR._all);
}
@Bindable
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
notifyPropertyChanged(BR.userName);
}
@Bindable
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
notifyPropertyChanged(BR.lastName);
}
}
ViewModel:
public class LoginViewModel extends ViewModel {
private User user;
public LoginViewModel() {
user = new User("Pero","Peric");
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getUserName()
{
return user.getUserName();
}
public void setUserName(String userName)
{
user.setUserName(userName);
}
public String getLastName()
{
return user.getLastName();
}
public void setLastName(String lastName)
{
user.setUserName(lastName);
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
LoginViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
viewModel = ViewModelProviders.of(this).get(LoginViewModel.class);
binding.setViewModel(viewModel);
binding.executePendingBindings();
binding.getViewModel().setUserName("John");
binding.executePendingBindings();
}
}
XML
<data>
<variable
name="viewModel"
type="com.example.bindinglearning.viewModels.LoginViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@={viewModel.userName}"
>
</EditText>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.lastName}"></EditText>
</LinearLayout>
答案 0 :(得分:0)
问题是我:
a)hadnt implement Observerble interface to ViewModel(I susspect that DataBinding
adds/removes his listener through that methods)
b)made get methods @Bindable,and notify notifyPropertyChanged() in seters,
c)add property in ViewModel of type PropertyChangeRegistry
d)add notifyPropertyChanged(int fieldID) method
ViewModel:
public class LoginViewModel extends ViewModel implements Observable {
private User user;
private PropertyChangeRegistry callbacks;
public LoginViewModel() {
user = new User("Karlo","maricevic");
callbacks = new PropertyChangeRegistry();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Bindable
public String getUserName()
{
return user.getUserName();
}
public void setUserName(String userName)
{
user.setUserName(userName);
notifyPropertyChanged(BR.userName);
}
@Bindable
public String getLastName()
{
return user.getLastName();
}
public void setLastName(String lastName)
{
user.setUserName(lastName);
}
@Override
public void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
callbacks.add(callback);
}
@Override
public void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
//callbacks.remove(callback);
}
void notifyPropertyChanged(int fieldId)
{
callbacks.notifyCallbacks(this,fieldId,null);
}
}
在此示例中进行了小小的实验后,PS不需要用户扩展BaseObservable即可从ViewModel更新UI