Перетащите Recyclerview с флажком, запускающим предыдущую позицию - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть следующий код для обработки опции перетаскивания для 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 голосов
/ 16 ноября 2018

Извините, я сам нашел ответ.Поэтому я добавляю этот ответ.
Использование позиции для обновления проверенного статуса неверно.Потому что положение предмета будет меняться при перемещении предмета.Чтобы справиться с этим, я использую уникальный идентификатор для поиска точного объекта.Во-первых, я устанавливаю уникальный идентификатор в качестве тега для флажка.

holder.cb_completed.tag = activity.list!!.items[pos].id

Внутри слушателя Onclick находит объект, который соответствует уникальному идентификатору.Как только мы нашли, я обновляю значение флажка

holder.cb_completed.setOnClickListener {
    activity.list!!.items.forEach { it ->
        if(it.id == holder.cb_completed.tag.toString().toLong()){
            it.isCompleted = holder.cb_completed.isChecked
        }
    }
}

Надеюсь, это поможет другим.

0 голосов
/ 14 ноября 2018

У меня нет 50 повторений, поэтому я не могу оставить комментарий, но у меня возникла похожая проблема, потому что я не обновлял список, который я передаю адаптеру

fun updateAdapterList(newList: MutableList<Object>) {
    adapterList.clear()
    adapterList.addAll(newList)
    notifyDataSetChanged()
}

В вашем случае просто используйте notifyItemMoved(dragged_item_pos, target_item_pos) и пройдите в требуемые позиции.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...