Android RecyclerView拖拽排序一数据库实现方式

1,061 阅读1分钟

需要:使用Room对保存的数据进行排序

实现思路1:也是最容易想到的,移动目标item到指定位置,从指定位置到位置改变了的item的Position全部+1或-1
优点:容易实现
缺点:执行时间长

实现思路2:参考网上找到的方法,为item的Position设置初始值65536(不要太小),然后依次增加一倍,然后根据Position大小排序。拖拽时根据位置对position进行修改,有以下三种情况:

override fun onDrag(
    source: BindingAdapter.BindingViewHolder,
    target: BindingAdapter.BindingViewHolder
) {
    val sourcePosition = source.absoluteAdapterPosition//进行拖拽item的新位置 
    val sourceModel = mMemoList[sourcePosition]
    val targetPosition =
        target.absoluteAdapterPosition//targetPosition 是target的移动方向的位置
    val targetModel = mMemoList[targetPosition]

when (sourcePosition) {
    0 -> {
        sourceModel.position = targetModel.position / 2
    }
    modelCount - 1 -> {
        sourceModel.position = targetModel.position + INCREMENT
    }
    else -> {
        val position =
            if (sourcePosition + 1 != targetPosition) sourcePosition + 1
            else sourcePosition - 1
        val model = mMemoList[position]
        sourceModel.position =
            (model.position + targetModel.position) / 2
    }
}
    val switchMemo = UrlMemoEvent.SwitchMemo()
    switchMemo.sourceModel = sourceModel
    mViewModel.input(switchMemo)
}

优点:执行时间短,效率高
缺点:当前后两个元素的数值,不满足整数时,需要更新所有元素的排序Position。

实现思路3:用双向链表实现,为表添加前后id两个字段,当移动时改变前后id即可
优点:更新执行时间短,效率高
缺点:查询时需要做处理,效率低

待续

如果有更好的方法欢迎你来分享。