问题描述
我目前正在研究如何使用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 (将#修改为@)