我想知道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" />
每次都会重绘吗?
答案 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
属性。