我正在研究自定义SwipeListView
,该自定义TranslationX
允许向左或向右滑动单元格,目前仅适用于Android。这工作得很好,但是由于某些原因,更改单元格ContentView
的{{1}}会影响ListView
中的其他单元格。每第8个单元格也会发生TranslationX
变化(至少在视觉上是这样):
这是导致此行为的代码行:
mainContent.TranslationX = quota * Width + mainContentPositionX;
我尝试了一些可能的解决方案,但没有一个起作用:
CachingStrategy
(RetainElement,RecycleElement,RecycleElementAndDataTemplate)尝试每个不同的ListView
TranslationX
之后,遍历我的ListView
中的所有其他单元并将其TranslationX
设置为0 我确定问题在于单元正在被重用,这就是为什么它应用TranslationX
的原因,但是如果是那样,那么我就感到困惑,为什么使用CachingStrategy=RetainElement
不能解决问题
我也将感谢能帮助调试此问题的想法。
我为iOS实现了SwipeListView
功能,它可以正常工作。似乎是Android问题。
我现在可以确认这只是Android中的问题。 iOS运行正常。
答案 0 :(得分:0)
您在分析中正确地认为问题出在物品回收上。当您以编程方式更改翻译时,框架不会意识到您所做的更改,并且您希望将其还原,因此它会将翻译保持原样。所有缓存策略都涉及项目回收,包括RetainElement
。回收最好保持启用状态,因为它可以大大提高性能。
可能的解决方案是使用数据绑定设置TranslationX
属性,并在ViewModel上具有bounded属性。这样,无论何时回收控件并将其绑定到新的ViewModel,值都会重置。您可以在ViewModel上引入一个整数属性并将其绑定到TranslationX
,或者更干净的方法是引入一个IsSwipped
之类的布尔属性,并在其上创建数据触发器以根据需要设置转换。