在MvxRecyclerView中设置OneTime绑定后滚动仍重复绑定的问题
嘿,我来帮你解决这个MvxRecyclerView里OneTime绑定重复执行的问题~
关于MvxRecyclerView中OneTime绑定重复触发的问题
你遇到的这个情况,核心原因其实和RecyclerView的Item复用机制直接相关,哪怕设置了OneTime绑定模式,也可能因为View复用导致绑定逻辑重复执行。
为什么会出现这个问题?
- MvvmCross的
OneTime绑定是指绑定首次建立时执行一次,但RecyclerView会回收离开屏幕的ItemView,当新数据进入屏幕时,这些复用的View会重新和新数据建立绑定关系——这就会触发绑定逻辑再次执行。 - 如果你的Style绑定类没有处理View复用的场景,没有判断当前View是否已经应用过目标样式,就会每次绑定都重复执行逻辑。
可行的解决办法
1. 给绑定类添加复用状态判断
在你的Style绑定类里增加一个标记,判断当前View是否已经应用过样式,避免重复执行逻辑,同时在View被回收时重置标记:
public class CustomStyleBinding : MvxAndroidTargetBinding { private bool _styleApplied; private readonly TextView _targetTextView; public CustomStyleBinding(TextView target) : base(target) { _targetTextView = target; } public override Type TargetType => typeof(YourStyleModel); protected override void SetValueImpl(object target, object value) { if (_styleApplied || value == null) return; // 执行你的样式设置逻辑 ApplyTextStyle(_targetTextView, value as YourStyleModel); _styleApplied = true; } // 关键:View被回收时重置标记,确保下次复用能重新绑定 public override void ClearBinding() { _styleApplied = false; base.ClearBinding(); } }
2. 借助MvxRecyclerViewHolder优化复用逻辑
在你的RecyclerView Adapter里使用MvxRecyclerViewHolder,并在OnViewRecycled方法中清理绑定相关状态:
public class YourItemViewHolder : MvxRecyclerViewHolder { public YourItemViewHolder(View itemView) : base(itemView) { } public override void OnViewRecycled() { // 可以用Tag存储状态,这里重置标记 ItemView.SetTag(Resource.Id.style_applied_flag, false); base.OnViewRecycled(); } }
3. 确认绑定表达式的正确性
确保AXML里的绑定确实指定了OneTime模式,写法如下:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" local:MvxBind="Style YourStyleProperty, Mode=OneTime" />
另外,如果你的样式计算逻辑比较耗时,也可以在ViewModel层面提前缓存计算结果,这样哪怕绑定重复执行,也只是读取缓存,不会带来性能负担。
内容的提问来源于stack exchange,提问作者Drake
相关产品推荐
相关产品推荐

