Moving Same Item Twice in RecyclerView With ItemTouchHelper

54 Views Asked by At

First time messing with this TouchHelper, apologies. I just want to be able to move the same item twice without navigating to another activity to refresh the recyclerview. I assume I just don't know which 'notify' to use for the adapter.

After moving an item vertically (swiping is disabled intentionally), I am unable to move the item again. It visually may swap text with an item if I try to move it for a split second, but it reverts back and doesn't show the visual animation that I have the item selected. It also doesn't update the database.

Main Activity:

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityHuntsBinding.inflate(layoutInflater)
    setContentView(binding.root)

    auth = FirebaseAuth.getInstance()

    // This will be used to connect the RecyclerView, adapter, and viewModel together
    val viewModel: HuntViewModel by viewModels()
    viewModel.getHunts().observe(this) { huntsList ->
        binding.huntsRecyclerView.adapter = HuntAdapter(this, huntsList, this)

        val adapter = binding.huntsRecyclerView.adapter as? HuntAdapter
        val itemTouchHelperCallback = adapter?.let { HuntItemTouchHelperCallback(it) }
        val itemTouchHelper = itemTouchHelperCallback?.let { ItemTouchHelper(it) }
        itemTouchHelper?.attachToRecyclerView(binding.huntsRecyclerView)
    }

Adapter:

    override fun onItemMove(fromPosition: Int, toPosition: Int): Boolean {
    // Swap the items in the list
    Collections.swap(hunts, fromPosition, toPosition)

    // Update the sort order values for the affected items
    for (i in hunts.indices) {
        hunts[i].sortOrder = i + 1
    }

    // Notify the adapter of the item movement
    notifyItemMoved(fromPosition, toPosition)

    return true
}

override fun onItemRelease() {
    auth = FirebaseAuth.getInstance()

    val db = FirebaseFirestore.getInstance().collection(auth.currentUser.uid)
    val batch = db.firestore.batch()
    for (hunt in hunts) {
        batch.update(db.document(hunt.created!!), "sortOrder", hunt.sortOrder)
    }
    batch.commit()
        .addOnSuccessListener {
            Log.w("DB_Response", "Sort order updated successfully for all hunts.")
        }
        .addOnFailureListener { e ->
            Log.w("DB_Response", "Error updating sort order for all hunts.", e)
        }
}

TouchHelper Class:

class HuntItemTouchHelperCallback(private val listener: ItemTouchHelperListener) : 

ItemTouchHelper.Callback() {

interface ItemTouchHelperListener {
    fun onItemMove(fromPosition: Int, toPosition: Int): Boolean
    fun onItemRelease()
}

override fun isLongPressDragEnabled(): Boolean {
    return true
}

override fun isItemViewSwipeEnabled(): Boolean {
    return false
}

override fun getMovementFlags(
    recyclerView: RecyclerView,
    viewHolder: RecyclerView.ViewHolder
): Int {
    val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
    return makeMovementFlags(dragFlags, 0)
}

override fun onMove(
    recyclerView: RecyclerView,
    viewHolder: RecyclerView.ViewHolder,
    target: RecyclerView.ViewHolder
): Boolean {
    return listener.onItemMove(viewHolder.adapterPosition, target.adapterPosition)
}

override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
}

override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) 
{
    super.clearView(recyclerView, viewHolder)
    listener.onItemRelease()
}
}
0

There are 0 best solutions below