属性更改时,UI不会更新

时间:2019-10-14 22:45:03

标签: java android mvvm data-binding

当我从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>

1 个答案:

答案 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