如何解决拖放操作无法正常进行,只有选定的项目在移动其他物品不能顺畅移动
我目前正在研究如何使用AAC和MVVM模式。我正在通过拖放进行recyclerview。但是只有选定的项目被移动。其他是固定的。这是描述问题的图像。 enter image description here
我的适配器不是RecyclerView.Adpater,而是ListAdapter。我使用数据绑定,LiveData和ViewModel。这是我的代码。有什么问题??我不知道问题出在哪里。另外,我不确定如何在适配器的onItemMove函数中交换两个项目。 onItemMove函数的代码不清楚。
ItemTouchHelper
class ItemMoveCallback(private val adapter: TodoAdapter) : ItemTouchHelper.Callback() {
override fun getMovementFlags(recyclerView: RecyclerView,viewHolder: RecyclerView.ViewHolder): Int {
val mFlag = ItemTouchHelper.UP or ItemTouchHelper.DOWN
val sFlag = ItemTouchHelper.END or ItemTouchHelper.START
return makeMovementFlags(mFlag,sFlag)
}
override fun onMove(
recyclerView: RecyclerView,viewHolder: RecyclerView.ViewHolder,target: RecyclerView.ViewHolder
): Boolean {
//adapter.onItemMove(viewHolder.adapterPosition,target.adapterPosition)
return true
}
override fun isLongPressDragEnabled(): Boolean {
return true
}
}
适配器
class TodoAdapter(application: Application): ListAdapter<Todo,TodoAdapter.ViewHolder>(TodoDiffUtil) {
private val viewModel = MainViewModel(application)
override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): ViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val binding =
DataBindingUtil.inflate<ItemTodoBinding>(layoutInflater,viewType,parent,false)
return ViewHolder(binding)
}
override fun getItemViewType(position: Int): Int {
return R.layout.item_todo
}
override fun getItemCount(): Int {
return super.getItemCount()
}
override fun onBindViewHolder(holder: ViewHolder,position: Int) {
val todo = getItem(position)
holder.bind(todo)
}
@Override
fun onItemMove(startPos:Int,endPos:Int) {
val temp = getItem(startPos).id
getItem(startPos).id = getItem(endPos).id
getItem(endPos).id = temp
viewModel.viewModelScope.launch ( Dispatchers.IO ){
viewModel.itemSwap(getItem(startPos),getItem(endPos))
}
}
inner class ViewHolder(private val binding: ItemTodoBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(todo: Todo) {
binding.todo = todo
binding.executePendingBindings()
}
}
companion object TodoDiffUtil : DiffUtil.ItemCallback<Todo>() {
override fun areItemsTheSame(oldItem: Todo,newItem: Todo): Boolean {
return oldItem == newItem
}
override fun areContentsTheSame(oldItem: Todo,newItem: Todo): Boolean {
return oldItem == newItem
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。