2017-05-15 23 views
0

比方说,我有这样的观点与方法模型:我可以使用具有重叠值集的BindingAdapter吗?

public int getValueA() { 
    return a; 
} 

public int getValueB() { 
    return b; 
} 

@BindingAdapter("valueA") 
public void setupSomething(View view, int valueA) { 
    // do something with a 
} 

@BindingAdapter({"valueA", "valueB"}) 
public void setupSomethingElse(View view, int valueA, int valueB) { 
    // do something with a and b 
} 

,我结合这一个观点:

<View 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    bind:valueA="@{viewmodel.valueA}" 
    bind:valueB="@{viewmodel.valueB}"/> 

我怎样才能通话双方BindingAdapter方法呢?现在数据绑定只是调用后者。我想我可以在setSomethingElse之内拨打setSomething,但这对我来说有点腥味(并且部分打破了数据绑定的目的)。

回答

2

这就像你建议你自己:你需要从setupSomethingElse拨打setupSomething()。这样做很好,以及数据绑定如何工作。 只有最适合的@BindingAdapter将用于您的属性。

另外,您也可以使用@BindingAdapterrequireAll()字段。但是,如果您可以为您的值处理Java默认值(在您的情况下为0),这是唯一可行的。

无论每个属性都必须分配一个结合表达或如果一些可以不存在。如果这是false,至少有一个关联的属性具有绑定表达式时,将调用BindingAdapter。没有绑定表达式(即使是正常的XML值)的属性将导致关联的参数接收Java默认值。必须注意确保默认值不与有效的XML值混淆。

@BindingAdapter({"valueA", "valueB"}, requireAll = false) 
public void setupSomethingElse(View view, int valueA, int valueB) { 
    if (valueA != 0) { 
     // do something with a 
     if (valueB != 0) { 
      // do something with a and b 
     } 
    } 
} 

所以你不需要setupSomething()了。但我个人更喜欢第一种方法。

+0

两个很好的答案。谢谢! – tir38

相关问题