You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin:RecyclerView拖拽排序仅在释放时更新Firestore

解决方案

问题出在你把Firestore更新逻辑放在了onMove方法里——这个方法会在拖拽过程中每一次位置变动时都被触发,所以才会频繁调用更新。要实现仅在放下列表项时更新,只需要把更新逻辑移到拖拽操作结束的回调方法里:

  1. 先把onMove里的updateFirestoreList()删掉,只保留本地列表和适配器的更新逻辑;
  2. 在ItemTouchHelper.SimpleCallback中重写clearView方法——这个方法会在用户结束拖拽(松开手指)、视图恢复正常状态时触发,在这里调用Firestore更新即可。

修改后的完整代码如下:

val itemTouchHelper = ItemTouchHelper(
    object: ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0){
        override fun onMove(
            recyclerView: RecyclerView,
            source: RecyclerView.ViewHolder,
            target: RecyclerView.ViewHolder
        ): Boolean {
            val sourcePosition = source.adapterPosition
            val targetPosition = target.adapterPosition

            Collections.swap(itemList, sourcePosition, targetPosition)
            adapter.notifyItemMoved(sourcePosition, targetPosition)

            // 移除这里的Firestore更新调用
            return true
        }

        override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
            TODO("Not yet implemented")
        }

        // 新增clearView方法,在拖拽结束时触发Firestore更新
        override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
            super.clearView(recyclerView, viewHolder)
            updateFirestoreList()
        }
    })

这样修改后,只有当用户完成拖拽并放下列表项时,才会执行Firestore的更新操作,避免了过程中的频繁调用。

内容的提问来源于stack exchange,提问作者Malhar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:50:04