拖放带有触发前一个位置的复选框的Recyclerview

时间:2018-11-14 12:18:26

标签: android android-recyclerview kotlin

我有以下代码用于处理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.

2 个答案:

答案 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
        }
    }
}

希望对他人有帮助。