Android数据绑定和三元运算符(?:)获取drawables

时间:2016-07-16 23:09:28

标签: android data-binding android-databinding

我试图得到drawables取决于函数是假还是真。但我做错了什么。所以任何帮助都表示赞赏

            <ImageView
              android:layout_width="24dp"
              android:layout_height="24dp"
              android:onClick="@{() -> handler.onVoteClicked(gameFeed.uid)}"
              android:src="@{() -> handler.existInList(feed.ratings,feed.uid) ? @drawable/ic_star_border : @drawable/ic_star}"
              android:layout_gravity="center_vertical"/>

这是我试图从我的处理程序调用的函数。

  public boolean existInList(Map<String,Boolean> ratings, String userId) {
    for (Map.Entry<String, Boolean> entry : ratings.entrySet()) {
      if(entry.getValue().equals(userId)) {
       return true;
      }
    }
    return false;
  }

我添加了错误

Execution failed for task ':app:compileDebugJavaWithJavac'.
> java.lang.RuntimeException: Found data binding errors.
  ****/ data binding error ****msg:Cannot find the proper callback class 
for android:src. Tried android.graphics.drawable.Drawable but it has 4 abstract methods, should have 1 abstract methods. file:/Users/brahim/ProjectNinjo/app/src/main/res/layout/adapter_feed_row.xml loc:108:33 - 108:135 ****\ data binding error ****

更新

我注意到它可以抓住可绘制的。但它在调用该函数时遇到问题。我猜我不能从三元运算符调用函数或者我以错误的方式调用函数

2 个答案:

答案 0 :(得分:11)

您使用的语法错误。 () -> ...是回调语法,在事件发生时执行。

示例:android:onClick="@() -> callback.onClick()"

相反,你只需要一个像这样的简单绑定表达式:

android:src="@{handler.existInList(feed.ratings,feed.uid) ? @drawable/ic_star_border : @drawable/ic_star}"

答案 1 :(得分:1)

这解决了它。而不是在处理程序类上调用函数。我发现一个hashmap包含了函数。所以这解决了它

            <ImageView
              android:layout_width="24dp"
              android:layout_height="24dp"
              android:onClick="@{() -> handler.onVoteClicked(feed.uid)}"
              android:src="@{feed.ratings.containsKey(feed.uid) ? @drawable/ic_star : @drawable/ic_star_border}"
              android:layout_gravity="center_vertical"/>