重用MvxListView中的项目

时间:2014-10-13 14:01:14

标签: android data-binding mvvmcross

我想知道MvxAdapter如何在GetBindableView中处理viewToUse。我知道它改变了该视图的数据上下文但它意味着什么?如果我们有一些TextView:

<TextView
        android:layout_width="match_parent"
        android:layout_height="@dimen/warning_item_height"
        local:MvxBind="Text SomeTextProperty; Visibility IsRemoved, Converter=Visibility" />

上下文更改首先确定旧项目中的IsRemoved属性是否等于新项目中的属性...并且可能避免使用转换器?这个例子可能无关紧要,但如果我们试图隐藏一些图片就会成为一个问题。它会每次重绘吗?

如果没有转换器......如果我们只有简单的MvxImageView?

<Mvx.MvxImageView
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:scaleType="fitCenter"
    local:MvxBind="AssetImagePath SomeImagePath" />

每次都会重绘吗?

1 个答案:

答案 0 :(得分:1)

重用列表项时,绑定将再次设置DataContext,这将导致重新评估绑定。

  

上下文更改首先确定旧项目中的IsRemoved属性是否等于新项目中的属性...并且可能避免使用转换器?

否 - IsRemoved属性的先前状态未在任何位置缓存 - 因此将调用转换器。

  

每次都会重绘吗?

如果控件的属性没有改变,并且如果控件本身检查了这一点,那么可以避免重绘 - 例如对于Android上的MvxImageView,它会检查value == existing中的MvxDynamicImageHelper - 请参阅https://github.com/MvvmCross/MvvmCross/blob/bbf9a2ac76e74d9404f4b57036c6e29dfe2cc6c3/Plugins/Cirrious/DownloadCache/Cirrious.MvvmCross.Plugins.DownloadCache/MvxDynamicImageHelper.cs#L73

注意:

  • 此处还有一个边缘案例 - 如果从可见性中删除列表项视图,那么适配器会将其DataContext设置为null - 因此,如果该列表项视图是稍后重复使用,然后该值将在返回重用时通过空转换。

  • 如果任何应用需要优化行为,那么它可以直接使用自定义控件来帮助解决这个问题 - 例如继承自MvxImageView并提供要绑定的自定义MyAssetImagePath属性。