Единственный способ добиться этого - привязать ваши ViewHolder
s, чтобы их TextView
s отображали измененные позиции. Но вызов notifyDataSetChanged()
или notifyItemRangeChanged(0, pos)
приведет к тому, что все ваши элементы исчезнут и исчезнут, так как все они были повторно привязаны, я бы не рекомендовал это, поскольку это довольно уродливо (но все же, это будет работать )
Вы когда-нибудь использовали метод onBindViewHolder(holder: ViewHolder, position: Int, payloads: MutableList<Any>)
? Это позволяет обновить только некоторые View
внутри вашего ViewHolder
без перерисовки всего View
, поэтому изменения в вашем RecyclerView
будут намного более плавными.
В вашем методе onMove
, который вы вызываете notifyItemRangeChanged
предоставляет диапазон элементов, которые должны быть обновлены, и предоставляет Any () в качестве полезной нагрузки, так как для перепривязки представления не требуется никакой дополнительной информации, поскольку у вас будет позиция и данные, доступные в методе адаптера.
override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
val fromPosition = viewHolder.adapterPosition
val toPosition = target.adapterPosition
Collections.swap(steps!!, fromPosition, toPosition)
recyclerView.adapter!!.notifyItemMoved(fromPosition,toPosition)
recyclerView.adapter!!.notifyItemRangeChanged(0, max(fromPosition, toPosition), Any())
// as you dont need to change items that are below the maximum positions
// their positions will be correct
return true
}
Помните, что вам следует вызывать метод super
, если полезные данные пусты.
override fun onBindViewHolder(holder: MyViewHolder, position: Int, payloads: MutableList<Any>) {
if (payloads.isEmpty()) super.onBindViewHolder(holder, position, payloads)
else {
holder.theTextView.text = "$position.)${myList[position].data}"
}
}
update
Вы уверены, что звоните notifyItemRangeChanged(min(fromPos, toPos), max(fromPos,toPos)
? Эта вещь будет вызывать onBindViewHolder
для каждого предмета в диапазоне. Вам следует позвонить после того, как вы позвоните notifyItemMoved
. Когда он работает, попробуйте передать объект в качестве полезной нагрузки.
Журналы не показывают поведение, похоже, это вывод, когда адаптер связывает представления после инициализации.