【发布时间】:2019-01-31 16:55:54
【问题描述】:
假设有一个简单的场景:
-
user用于存储用户详细信息的表 -
user_images在image_path字段中存储图像在手机存储中的路径。
RecyclerView 中显示了一个用户列表,用户可以滑动以删除一行。适配器是ListAdapter,数据来自Room,为LiveData
我想的工作流程是这样的:
- 从适配器中移除刷过的项目并更新recyclerview
- 显示带有撤消选项的小吃
- 在 Snack 上,如果用户按下撤消,则在
ListAdapter中重新添加项目并更新回收站视图。如果用户没有按 Undo 并且 Snack 在超时后被关闭,请从user、user_images中删除行,并从image_path中与user_images相关的存储中删除所有图像
...
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
}
}
}
...
问题在于使用 ListAdapter。您可能知道它使用 DiffCallBack 来管理视图更新,并且调用 adapter.submitList(list) 不会触发任何更新,因为它接收到相同的列表。 (ListAdapter not updating item in reyclerview)
因此,为了能够删除项目,我需要:
- 获取适配器的
currentList为MutableupdatebleList - 从 updatebleList 中删除项目
- 重新提交列表给适配器
adapter.submitList(updatebleList.toList()) - 在Undo的情况下,将该项目重新添加到updatebleList并作为新列表再次提交
adapter.submitList(updatebleList.toList())
如您所见,为了正确提交,需要重新创建大量列表。 有没有更好/更简单的方法来实现这一目标?
【问题讨论】:
-
您应该有数据的中间表示,包含删除状态。因为在活动/片段中管理它不是执行它的地方。
-
无论如何你都需要将它从数据库表中删除..然后再次插入它,然后一切都会自动重新出现(来自数据库查询的LiveData和RecyclerView的sumbit func)
标签: android android-recyclerview listadapter