我有以下代码用于处理RecyclerView的拖放选项。
class TodoActivity : AppCompatActivity() {
lateinit var adapter: ToDoItemAdapter
lateinit var touchHelper: ItemTouchHelper
var list: ToDoList? = null
override fun onCreate(savedInstanceState: Bundle?) {
.....
rv_item_list.layoutManager = LinearLayoutManager(this)
.....
touchHelper =
ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0) {
override fun onMove(
rv: RecyclerView,
dragged: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
val dragged_item_pos = dragged.adapterPosition
val target_item_pos = target.adapterPosition
Collections.swap(list.items, dragged_item_pos, target_item_pos)
adapter.notifyItemMoved(dragged_item_pos, target_item_pos)
return false
}
override fun onSwiped(p0: RecyclerView.ViewHolder, p1: Int) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
})
touchHelper.attachToRecyclerView(rv_item_list)
}
class ToDoItemAdapter(val context: Context, val activity: TodoActivity) :
override fun onBindViewHolder(holder: ViewHolder, pos: Int) {
holder.cb_completed.setOnClickListener {
.....
}
}
}
}
在不拖移任何项目的情况下,我尝试选中运行正常的复选框。现在的问题是,如果我检查项目,则拖动项目后它会触发前面的复选框。
例如:
I have Item 1, Item 2, Item 3.
I dragged the Item 3 to Item 1 position.
Now the order is Item 3, Item 1, Item 2
If I check Item 3(Position 0), Its checking Item 2(Position 2). Because currently Item 2 has the position of previous Item 3 position.
答案 0 :(得分:0)
我没有50名代表,所以不能发表评论,但是我遇到了类似的问题,这是因为我没有更新传递给适配器的列表
fun updateAdapterList(newList: MutableList<Object>) {
adapterList.clear()
adapterList.addAll(newList)
notifyDataSetChanged()
}
对于您而言,只需使用notifyItemMoved(dragged_item_pos, target_item_pos)
并传递所需的位置即可。
希望这会有所帮助
答案 1 :(得分:0)
对不起,我自己找到了答案。所以我要添加这个答案。
使用位置更新检查状态是错误的。因为在移动项目时项目的位置会有所不同。为了解决这个问题,我使用一个唯一的ID来查找确切的对象。
首先,我将唯一ID设置为复选框的标签。
holder.cb_completed.tag = activity.list!!.items[pos].id
内部Onclick侦听器查找与唯一ID相匹配的对象。找到后,我将更新复选框的值
holder.cb_completed.setOnClickListener {
activity.list!!.items.forEach { it ->
if(it.id == holder.cb_completed.tag.toString().toLong()){
it.isCompleted = holder.cb_completed.isChecked
}
}
}
希望对他人有帮助。