我使用ItemTouchHelper
“滑动删除”来实现该功能。我知道还有其他方法可以做到这一点,但我读到使用ItemTouchHelper
是最方便和现代的,此外它不需要第三方库。
这就是我的应用程序目前的行为方式。一旦屏幕上没有剩余元素,图片就会显示在中间
购物车在ShoppingCartFragment.javaRecyclerView
片段中实现,此片段中使用的适配器在ShoppingCartItemRecyclerViewAdapter.java中实现。抱歉,我不是在这里发布代码,而是在 github 上发布——这是由于 30,000 个字符的限制。我将我的整个项目放在StackOverflow 的一个单独的分支中,这样这段代码就不会在未来消失。
问题
为什么滑动时元素的顶部和底部有边缘?
为什么在删除列表中间的元素后留下的红色背景高度整齐地降低(gif 1),而在删除元素后,如果这个元素是列表中唯一的一个,动画不会改变高度列表(gif 2)。
如何在 UNDO 按钮出现的动画过程中去除黑色阴影(即当她从左边驶出时)?在我看来,我需要更改隐藏在 ItemTouchHelper 某处的撤消按钮外观的标准动画,但我不知道在哪里做(即哪个方法对此负责)
最重要的问题- 如何为位于滑动移动的元素“后面”的对象设置自己的动画?例如,Gmail 使用完全不同的动画来显示 UNDO 按钮:
我将很高兴收到任何意见、链接和建议。如果我不清楚某处,请随时提问。
这个答案稍后会更新。
因此,这就是我设法找到的有关上述问题的信息。别忘了我链接到我github上相应分支的项目代码。
1)在我看来,有两个可能的原因:它与用于 RecyclerView 的 ItemDecorator(ShoppingCartFragment.java,第 344 行)有关,或者我们看不到 RecyclerView 项目的影子,因为 它们之间没有距离,阴影只是“隐藏”在相邻的列表项下。我现在没有时间或机会找出答案,所以这个问题仍然可以被认为是开放的。一旦我弄清楚阴影的这种行为是什么,我会立即更新答案。
2)这是因为你看到的“动画”是一种错觉。事实上,红色背景本身并没有改变高度——它只是与下面的元素重叠。如果您在标记中添加缩进,这很容易看出。
为了消除这种悲惨的行为,将红色背景的顶部和底部边缘分别锚定到顶部和底部列表项就足够了。
请记住,使用 getTop() 和 getBottom() 获取红色背景坐标是不可能的(至少它对我不起作用)。所以我使用 getLocationInWindow() 来做到这一点
3) 要回答这个问题,您需要了解您在滑动之前和之后在屏幕上看到的视图实际上是同一个视图。此视图同时包含两种状态的元素,但默认情况下只有一种状态可见 - 这是滑动前视图中固有的状态。当滑动发生时,我们以编程方式隐藏“预滑动”状态的嵌套视图,并显示滑动后应该出现的视图(例如,撤消按钮)。这可以在第 157 行的文件ShoppingCartItemRecyclerViewAdapter.java中找到。但是最好在图片中显示列表项的内部而不是用文字解释(shopping_cart_item.xml: 为了摆脱阴影 - 我只是将它们关闭在代码中:

4)我还没有这个问题的答案。我什至不知道去哪里挖。我希望稍后再回到这个问题并确保更新这个答案。