繁体   English   中英

当数据绑定android中的数据发生变化时如何更新UI?

[英]How to update UI when data changes in data-binding android?

我有一个活动,其中显示一个文本视图:

<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="Users"
            type="com.example.mvvm.model.UserInfoModel" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".view.MainActivity">

        <TextView
            android:id="@+id/tv_main"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="50dp"
            android:text="@{Users.name,default = hello}"/>

    </LinearLayout>

</layout>

还有我的 UserInfoModel 类:

public class UserInfoModel {
private String name;

public UserInfoModel() {
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

在我的活动中:

public class MainActivity extends AppCompatActivity {

ActivityMainBinding binding;
UserInfoModel users;
TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    
    textView = binding.tvMain;

    users = new UserInfoModel();

    users.setName("Stack");

    viewAction();

    binding.setLifecycleOwner(this);
    binding.setUsers(users);
}
}

我的问题是,当我在viewAction方法中更改名称时,如下所示:

 private void viewAction() {
    textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            users.setName("Change Text");
        }
    });
}

我的 UI 没有改变,文本视图仍然显示Stack 我尝试使用binding.notifyPropertyChanged(id)但它不影响。 我的错误在哪里? 如何更改数据?

感谢您的关注。

实际上问题是生成的绑定类不知道何时更改属性。 你应该通知它。 首先,您的视图模型可以从 BaseObservable 类继承,然后您必须在视图模型中的 getter 中添加 @Bindable 注释,并在 setter 中使用来自 BR 类的适当 id 调用 notifyPropertyChanged(它将由数据绑定库为您生成,只需添加 @可绑定注释。例如 notifyPropertyChanged(BR.name) )。 您还应该注意如何在 MainActivity 类中存储“绑定”变量。它可能导致内存泄漏。 你可以调查那个问题。 请参阅像 databindingPropertyDelegate 这样的库。

像这样的东西

public class UserInfoModel extends BaseObservable{
     @Bindable
     public String getName() {
           return name; 
     } 
     public void setName(String name) {
           this.name = name; 
           notifyPropertyChanged(BR.name)
     }
}

你可以让你的字段在模型中可见。

public class UserInfoModel {
private ObservableField<String> name;

public UserInfoModel() {
 this.name = new ObservableField<>();
}

public ObservableField<String> getName() {
return name;
}

public void setName(String name) {
this.name.set(name);
}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM