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

时间:2018-11-08 08:25:30

标签: c# xamarin xamarin.forms

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

Swipe Bug

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

mainContent.TranslationX = quota * Width + mainContentPositionX;

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

  • CachingStrategy(RetainElement,RecycleElement,RecycleElementAndDataTemplate)尝试每个不同的ListView
  • 在MainThread上运行代码
  • 操纵TranslationX之后,遍历我的ListView中的所有其他单元并将其TranslationX设置为0

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

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


编辑

我为iOS实现了SwipeListView功能,它可以正常工作。似乎是Android问题。


编辑-Github存储库

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

编辑

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

1 个答案:

答案 0 :(得分:0)

您在分析中正确地认为问题出在物品回收上。当您以编程方式更改翻译时,框架不会意识到您所做的更改,并且您希望将其还原,因此它会将翻译保持原样。所有缓存策略都涉及项目回收,包括RetainElement。回收最好保持启用状态,因为它可以大大提高性能。

可能的解决方案是使用数据绑定设置TranslationX属性,并在ViewModel上具有bounded属性。这样,无论何时回收控件并将其绑定到新的ViewModel,值都会重置。您可以在ViewModel上引入一个整数属性并将其绑定到TranslationX,或者更干净的方法是引入一个IsSwipped之类的布尔属性,并在其上创建数据触发器以根据需要设置转换。