ListView单元格翻译操作会影响其他单元格

Den*_*öer 5 c# xamarin xamarin.forms

我正在研究一种自定义功能SwipeListView,该功能允许向左或向右滑动单元格,目前仅适用于Android。这工作得很好,但是由于某些原因TranslationX,单元格的变化ContentView会影响的其他单元格ListView。每第8个单元格也会更改一次TranslationX(至少在视觉上):

刷虫

这是导致此行为的代码行:

mainContent.TranslationX = quota * Width + mainContentPositionX;
Run Code Online (Sandbox Code Playgroud)

我尝试了一些可能的解决方案,但没有一个起作用:

  • 每次尝试不同CachingStrategyListView(RetainElement,RecycleElement,RecycleElementAndDataTemplate)
  • 在MainThread上运行代码
  • 操作后TranslationX,遍历my中的所有其他单元格ListView并将其设置TranslationX为0

我确定问题在于单元正在被重用,这就是为什么要应用该TranslationX操作,但是如果是那样,那么我就感到困惑,为什么使用CachingStrategy=RetainElement不能解决问题。

我也将感谢能帮助调试此问题的想法。


编辑

SwipeListView为iOS 实现了该功能,并且可以正常使用。似乎是Android问题。


编辑-Github存储库

我添加了一个示例Github存储库:https : //github.com/Zure1/SwipeListView-Sample

编辑

现在,我可以确认这只是Android中的问题。iOS运行正常。

Moh*_*mad 0

您的分析是正确的,问题在于物品回收。当您以编程方式更改翻译时,框架不知道您的更改,并且您希望将其恢复,以便它保持翻译原样。所有缓存策略都涉及项目回收,包括RetainElement。回收最好保持启用状态,因为它可以带来巨大的性能提升。

解决您的问题的一个可能的解决方案是使用数据绑定来设置TranslationX属性并在 ViewModel 上使用绑定属性。这样,只要控件被回收并绑定到新的 ViewModel,值就会重置。您可以在 ViewModel 上引入一个整数属性并将其绑定到,TranslationX或者更简洁的方法是引入一个布尔属性(例如)IsSwipped并在其上创建一个数据触发器以根据需要设置转换。