gpt4 book ai didi

java - 如何使用 firebase 实时数据库在回收站 View 上使用拖放

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:11:45 25 4
gpt4 key购买 nike

我正在尝试将拖放功能实现到 firebase 回收器 View 。此实现的文档中没有足够的信息。我假设我必须使用 onchildmoved 作为事件监听器,但我不知道如何重新排序数据。

最佳答案

我在尝试让它在 Firebase UI 3.1.0 上为自己工作时遇到了很多困惑。这是我最终的工作解决方案(下面的解释):

// overrides from ItemTouchHelper
override fun onMove(recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder): Boolean {
val fromPos = viewHolder.adapterPosition
val toPos = target.adapterPosition

val fromSnapshot = snapshots.first { it.order == fromPos }
val toSnapshot = snapshots.first { it.order == toPos }

Logger.d("Habit ${fromSnapshot.name} (${fromSnapshot.order}) to $toPos")
Logger.d("Habit ${toSnapshot.name} (${toSnapshot.order}) to $fromPos")
fromSnapshot.order = toPos
toSnapshot.order = fromPos

hasDragged = true

notifyItemMoved(toPos, fromPos)
return true
}
// overrides from FirebaseRecyclerAdapter
override fun onChildChanged(type: ChangeEventType?, snapshot: DataSnapshot?, newIndex: Int, oldIndex: Int) {
when (type) {
ChangeEventType.MOVED -> if (!hasDragged) {
super.onChildChanged(type, snapshot, newIndex, oldIndex)
}
else -> super.onChildChanged(type, snapshot, newIndex, oldIndex)
}
}

override fun onDataChanged() {
hasDragged = false
}

我可能做错了什么,但似乎this answer above上面的代码重复了工作,因为 FirebaseRecyclerAdapter 和可观察的快照将根据通知自动更新。这导致拖动以新值突然结束。我还通过使用 getSnapshots().get(pos)(kotlin 中的 snapshots[fromPos])得到了错误的订单号(可能是我的错)。这导致了一些非常奇怪的动画。此外,在移动中通知时,我必须反转到/从(目标/viewHolder)位置。但是,请注意,这确实依赖于使用 order 字段在查询中进行排序。最后,如果是因为用户拖动,我不想让 FirebaseRecyclerAdapter#onChildChanged 方法调用,这也会导致不需要的动画和重复工作。

关于java - 如何使用 firebase 实时数据库在回收站 View 上使用拖放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38084812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com