安卓开发 jetpack compose 帮我封装一个实现拖动可改变item位置组件
时间: 2023-06-14 08:04:57 浏览: 138
Android 水平拖动交换位置组件
好的,关于您的问题,我可以提供以下解决方案:
1. 创建一个自定义视图,并使其可拖动。
2. 在视图之间识别交换。
3. 重绘列表项,以便用户可以看到其新位置。
下面是一些代码片段来帮助您实现这个功能:
```kotlin
class DragDropListView(context: Context, attrs: AttributeSet?) :
ListView(context, attrs), View.OnDragListener {
private var startPosition = 0
private var currentPosition = 0
private var draggedItem: View? = null
init {
setOnItemLongClickListener { _, _, position, _ ->
startPosition = position
draggedItem = getChildAt(startPosition - firstVisiblePosition)
draggedItem?.startDrag(null, DragShadowBuilder(draggedItem), draggedItem, 0)
}
}
override fun onDrag(view: View, event: DragEvent): Boolean {
when (event.action) {
DragEvent.ACTION_DRAG_STARTED -> return true
DragEvent.ACTION_DRAG_ENTERED -> return true
DragEvent.ACTION_DROP -> {
currentPosition = pointToPosition(event.x.toInt(), event.y.toInt())
swapItems(startPosition, currentPosition)
return true
}
DragEvent.ACTION_DRAG_ENDED -> {
redrawList()
return true}
}
return false
}
private fun swapItems(index1: Int, index2: Int) {
val adapter = adapter as SimpleAdapter
val item1 = adapter.getItem(index1)
val item2 = adapter.getItem(index2)
adapter.remove(item1)
adapter.insert(item1, index2)
adapter.remove(item2)
adapter.insert(item2, index1)
}
private fun redrawList() {
val firstVisiblePosition = firstVisiblePosition
val lastVisiblePosition = lastVisiblePosition
adapter = adapter
for (i in firstVisiblePosition..lastVisiblePosition) {
getChildAt(i - firstVisiblePosition).invalidate()
}
}
}
```
这是一个自定义ListView类,它实现了拖放的功能。当用户长按项以启动拖放操作时,该getItem方法会调用startDrag方法创建ShadowBuilder对象并启动此操作。 onChanged方法实现向ListView中插入或交换项目。invalidate()方法在视图之间拆换完成后呈现数据。
希望这可以帮助你实现你的需求。
阅读全文