C# ListView单元格转换操作会影响其他单元格

C# ListView单元格转换操作会影响其他单元格,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我正在开发一个自定义的SwipeListView,它允许向左或向右滑动单元格,目前仅适用于Android。这可以很好地工作,但由于某些原因,更改单元格的ContentView会影响列表视图中的其他单元格。每第8个单元格也会发生变化,其TranslationX(至少在视觉上): 这是导致此行为的代码行: mainContent.TranslationX = quota * Width + mainContentPositionX; 我尝试过一些可能的解决方案,但没有一个有效: 为列表视图(R

我正在开发一个自定义的
SwipeListView
,它允许向左或向右滑动单元格,目前仅适用于Android。这可以很好地工作,但由于某些原因,更改单元格的
ContentView
会影响
列表视图中的其他单元格。每第8个单元格也会发生变化,其
TranslationX
(至少在视觉上):

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

mainContent.TranslationX = quota * Width + mainContentPositionX;
我尝试过一些可能的解决方案,但没有一个有效:

  • 列表视图
    (RetainElement、RecycleElement、RecycleElement和DataTemplate)尝试每种不同的
    CachingStrategy
  • 在主线程上运行代码
  • 操作
    TranslationX
    后,在我的
    ListView
    中遍历所有其他单元格,并将它们的
    TranslationX
    设置为0
我确信问题在于单元格被重用,这就是为什么它应用了
TranslationX
操作,但如果是这样,那么我很困惑为什么使用
CachingStrategy=RetainElement
不能解决问题

我还将感谢有助于调试此问题的想法


编辑 我为iOS实现了
SwipeListView
功能,它可以正常工作。这似乎是安卓系统的问题


编辑-Github存储库 我添加了一个示例Github存储库: 编辑
我现在可以确认这只是安卓系统的一个问题。iOS运行良好。

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


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

您可以发布适配器代码吗?@Aaron这到底是什么意思?这是一个
Xamarin
应用程序,我只包含了一个页面,自定义
SwipeListView
和一些Android自定义渲染器。这绝对是重复使用。如果您能以某种方式连接到单元格的
BindingContext
change事件,那将是一个放置重置滑动的好地方。你能在GitHub上发布一些代码或创建一个repo吗?@MartinZikmund在我的文章中添加了GitHub repopost@DennisSchröer表面上,这个库将实现您所追求的目标,并可能为您节省一些心痛-好主意,但我看到的问题是,为了滑动,我首先需要处理视图的触摸事件。所以我看不到让ViewModel处理这个问题的方法,因为它不知道我什么时候刷卡。我正在使用列表和项目的
DispatchTouchEvent
来实现对
TranslationX
的操作。是的,您仍然会在视图中保留滑动检测任务,因为这是一个视图问题。我认为解决方案可能涉及创建一个自定义行为()来设置属性,数据绑定可以将值传递到ViewModel。我建议您首先尝试Mark在上面的评论中建议的组件/库,因为如果它满足您的需要,使用它会更简单。是的,我将为Mark建议的库贡献力量。缺少了一些东西,但它看起来比我的代码干净多了,我可以从新开始,因为自从我打开这个问题以来,我的swipe项目的代码库增长了很多!谢谢你的建议