将一个类绑定到两个布局?

时间:2016-01-18 13:25:27

标签: android android-layout android-databinding

在我的应用程序中,我有一个myMapList.get(1)= {1=laptop, 2=pc, 3=stackover, 4=flow}类,它以两种不同的方式显示:一张包含所有信息的普通卡和一张只显示其部分数据的小卡。

所以,我有两种布局:$result,$row while($row = $result->fetch(PDO::FETCH_ASSOC)){ $pid = $row['product_id']; $quantity = $row['quantity']; $result1 = $db->prepare("SELECT * FROM Products WHERE productID=:pid"); $result1->bindParam(':pid', $pid); $result1->execute(); while($row1 = $result1->fetch(PDO::FETCH_ASSOC)){ echo $row1['naam']; } }

现在,我可以将这两个布局绑定到同一个Product类吗?

两种布局都有:

product_card.xml

我有一个product_card_small.xml选择其中一个布局。但是,当我想在其viewHolder中同时使用Product<data> <import type="com.MyTest.android.Models.Product"/> <variable name="product" type="Product"/> </data> 时,只能识别其中一个(productsAdapter)。另一个无法解决。

我想知道它是否可能,如果可能,为什么它只解决其中一个?

2 个答案:

答案 0 :(得分:0)

我有同样的问题。由于一个xml只能绑定到一个ViewDataBinding,因此您基本上无法做到这一点。我当前的解决方案是使用代理类。在您的情况下,如果ProductCardBinding,ProductCardSmallBinding都具有一个TextView和ImageView,则ProductCardBindingProxy如下所示:

class ProductCardBindingProxy {
    lateinit var someText: TextView
    lateinit var someImage: ImageView
    lateinit var viewDataBinding: ViewDataBinding

    fun bind(productCardBinding: ProductCardBinding) {
        this.viewDataBinding = productCardBinding
        this.someImage = productCardBinding.image
        this.someText = productCardBinding.text
    }

    fun bind(productCardSmallBinding: ProductCardSmallBinding) {
        this.viewDataBinding = productCardSmallBinding
        this.someImage = productCardSmallBinding.image
        this.someText = productCardSmallBinding.text
    }
}

然后您可以在CreateViewHolder上使用此

val proxy = ProductCardBindingProxy().apply { bind(viewBinder) }
ProductCardViewHolder(proxy)

我认为这不是很好的解决方案,但这至少可以解决。 :)

答案 1 :(得分:-1)

也许你可以这样做。我从不使用它。

<data class=".Item1">
    <import type="com.MyTest.android.Models.Product"/>
    <variable name="product" type="Product"/>
</data>
<data class=".Item2">
    <import type="com.MyTest.android.Models.Product"/>
    <variable name="product" type="Product"/>
</data>