【问题标题】:Recyclerview with ListAdapter DiffCallback and Undo on swipe option带有 ListAdapter DiffCallback 和 Undo on swipe 选项的 Recyclerview
【发布时间】:2019-01-31 16:55:54
【问题描述】:

假设有一个简单的场景:

  • user 用于存储用户详细信息的表
  • user_imagesimage_path 字段中存储图像在手机存储中的路径。

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

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

  1. 从适配器中移除刷过的项目并更新recyclerview
  2. 显示带有撤消选项的小吃
  3. 在 Snack 上,如果用户按下撤消,则在 ListAdapter 中重新添加项目并更新回收站视图。如果用户没有按 Undo 并且 Snack 在超时后被关闭,请从useruser_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) 因此,为了能够删除项目,我需要:

  • 获取适配器的currentListMutable updatebleList
  • 从 updatebleList 中删除项目
  • 重新提交列表给适配器adapter.submitList(updatebleList.toList())
  • 在Undo的情况下,将该项目重新添加到updatebleList并作为新列表再次提交adapter.submitList(updatebleList.toList())

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

【问题讨论】:

  • 您应该有数据的中间表示,包含删除状态。因为在活动/片段中管理它不是执行它的地方。
  • 无论如何你都需要将它从数据库表中删除..然后再次插入它,然后一切都会自动重新出现(来自数据库查询的LiveData和RecyclerView的sumbit func)

标签: android android-recyclerview listadapter


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-09-14
    • 1970-01-01
    • 2019-08-11
    • 2014-12-25
    • 2018-09-18
    • 2020-10-22
    • 2021-11-20
    • 2012-03-15
    • 1970-01-01
    相关资源
    最近更新 更多