带有ListAdapter DiffCallback的Recyclerview和“滑动时撤消”选项

时间:2019-01-31 16:55:54

标签: android android-recyclerview listadapter

假设有一个简单的场景:

  • user表,用于存储用户详细信息
  • user_images,将图像路径存储在image_path字段中。

RecyclerView中显示了一个用户列表,用户可以滑动以删除行。适配器是ListAdapter,数据来自Room,LiveData

我在想的工作流程是这样的:

  1. 从适配器中移除刷卡的物品并更新recyclerview
  2. 显示“带撤消小吃”
  3. 在Snack上,如果用户按下Undo,请在ListAdapter中重新添​​加该项目并更新recyclerview。如果用户未按“撤消”,并且超时后小吃被取消,请从useruser_images中删除行,并从与{{1 }}

...

user_images

...

问题是使用ListAdapter。如您所知,它使用DiffCallBack来管理视图更新,并且调用image_path不会触发任何更新,因为它接收到相同的列表。 (ListAdapter not updating item in reyclerview) 因此,为了能够删除项目,我需要:

  • 获取适配器的override fun onSwiped(...){ val deletedItem = listAdapter.currentList.get(index) //REMOVE FROM THE ADAPTER HERE val snack = Snackbar.make(...) snack.setAction(...){ //RE-ADD TO ADAPTER HERE } snack.addCallback(...){ override fun onDismissed(...){ //do the actual deletes } } } 作为adapter.submitList(list) updatebleList
  • 从updatebleList中删除项目
  • 将列表重新提交给适配器currentList
  • 如果要撤消,请将该项目重新添加到updatebleList,然后作为新列表Mutable再次提交

如您所见,为了正确提交,创建了大量列表。 有没有更好/更简单的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

我只是通过创建新的ItemTouchHelper()滑动即可删除MainActivity中的功能。 您可以在GitHub here上查看示例代码。