Пользовательский интерфейс не обновляется при изменении свойства - PullRequest
0 голосов
/ 15 октября 2019

Когда я обновляю свое свойство User в LoginViewModel из MainActivity, мой пользовательский интерфейс не меняется (застрял на этой проблеме 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 голосов
/ 15 октября 2019

Проблема была в том, что я:

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

...