需要:使用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即可
优点:更新执行时间短,效率高
缺点:查询时需要做处理,效率低
待续
如果有更好的方法欢迎你来分享。