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项目的代码库增长了很多!谢谢你的建议