15

我正在研究 android 数据绑定,并遇到了我们可以使用以下两种方式设置模型的场景:

 User user = new User("User", "Abc"); // this is a model
dataBinding.setVariable(BR.user, user);
dataBinding.executePendingBindings(); // and we have to do this... Why?

我们也可以设置如下:

binding.setUser(user);

谁能解释一下这两者之间有什么区别?

用户模型:

public class User{
public String fName;
public String lName;

public User(String fName, String lName){
this.fName = fName;
this.lName = lName;
   }
}
4

3 回答 3

16

考虑当您有一个不共享公共绑定布局的抽象类的情况(当然ViewDataBinding,所有绑定布局都继承自的超类除外):

public abstract classs EditorActivityFragment<T extends ViewDataBinding> {

在此类中,onCreateView()您将无法使用任何生成的方法将变量设置为绑定,因为除了 ViewDataBinding 之外没有公共超类,因此您将被迫使用反射,或者您可以使用方便的方法setVariable()

binding.setVariable(BR.viewModel,myViewModel);

我希望这有助于更好地解释这种方法的用例。

于 2016-05-21T20:42:30.127 回答
11

他们做同样的事情。根据文档,有时无法确定变量的类型,因此您必须使用该setVariable()方法。在正常情况下,setX()会生成方法。你最好使用生成的方法。

于 2016-03-25T17:56:42.430 回答
0

如果有人仍然不清楚,这里是来自官方文档的链接。链接到文档 - 点击这里

@JarettMillard 分享的文档摘录

boolean setVariable (int variableId, 
            Object value)

在 Binding 类中设置一个值。

通常,开发人员将能够直接调用子类的 set 方法。比如Binding中有一个变量x,就会生成一个setX方法。但是,有时 ViewDataBinding 的具体子类是未知的,所以不经过反射就无法发现生成的方法。setVariable 调用允许在没有反射的情况下设置变量的值。

他们的官方文档链接中的更多参考资料 !

override fun onBindViewHolder(holder: BindingHolder, position: Int) {
   item: T = items.get(position)
   holder.binding.setVariable(BR.item, item);
   holder.binding.executePendingBindings();
}

当您无法访问特定绑定类但更通用的版本时,这很有用,例如ViewDataBinding(它就像所有绑定的基类)。在这种情况下,您可以使用此方法来设置属性,就像在上面的情况中我们使用的项目变量一样。

于 2021-08-15T09:45:26.443 回答