diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/adapters/ChecklistAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/adapters/ChecklistAdapter.kt index 1875e988..081d1d62 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/adapters/ChecklistAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/adapters/ChecklistAdapter.kt @@ -4,8 +4,11 @@ import android.graphics.Paint import android.graphics.drawable.Drawable import android.util.TypedValue import android.view.Menu +import android.view.MotionEvent import android.view.View import android.view.ViewGroup +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.extensions.applyColorFilter @@ -17,20 +20,34 @@ import com.simplemobiletools.notes.pro.dialogs.RenameChecklistItemDialog import com.simplemobiletools.notes.pro.extensions.getTextSize import com.simplemobiletools.notes.pro.helpers.DONE_CHECKLIST_ITEM_ALPHA import com.simplemobiletools.notes.pro.interfaces.ChecklistItemsListener +import com.simplemobiletools.notes.pro.interfaces.ItemMoveCallback +import com.simplemobiletools.notes.pro.interfaces.ItemTouchHelperContract +import com.simplemobiletools.notes.pro.interfaces.StartReorderDragListener import com.simplemobiletools.notes.pro.models.ChecklistItem import kotlinx.android.synthetic.main.item_checklist.view.* import java.util.* class ChecklistAdapter(activity: BaseSimpleActivity, var items: ArrayList, val listener: ChecklistItemsListener?, recyclerView: MyRecyclerView, val showIcons: Boolean, itemClick: (Any) -> Unit) : - MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) { + MyRecyclerViewAdapter(activity, recyclerView, null, itemClick), ItemTouchHelperContract { private lateinit var crossDrawable: Drawable private lateinit var checkDrawable: Drawable + private var touchHelper: ItemTouchHelper? = null + private var startReorderDragListener: StartReorderDragListener init { setupDragListener(true) initDrawables() + + touchHelper = ItemTouchHelper(ItemMoveCallback(this)) + touchHelper!!.attachToRecyclerView(recyclerView) + + startReorderDragListener = object : StartReorderDragListener { + override fun requestDrag(viewHolder: RecyclerView.ViewHolder) { + touchHelper?.startDrag(viewHolder) + } + } } override fun getActionMenuId() = R.menu.cab_checklist @@ -76,7 +93,7 @@ class ChecklistAdapter(activity: BaseSimpleActivity, var items: ArrayList - setupView(itemView, item) + setupView(itemView, item, holder) } bindViewHolder(holder) } @@ -130,7 +147,7 @@ class ChecklistAdapter(activity: BaseSimpleActivity, var items: ArrayList - private fun setupView(view: View, checklistItem: ChecklistItem) { + private fun setupView(view: View, checklistItem: ChecklistItem, holder: ViewHolder) { val isSelected = selectedKeys.contains(checklistItem.id) view.apply { checklist_title.apply { @@ -149,10 +166,36 @@ class ChecklistAdapter(activity: BaseSimpleActivity, var items: ArrayList + if (event.action == MotionEvent.ACTION_DOWN) { + startReorderDragListener.requestDrag(holder) + } + false + } } } + + override fun onRowMoved(fromPosition: Int, toPosition: Int) { + if (fromPosition < toPosition) { + for (i in fromPosition until toPosition) { + Collections.swap(items, i, i + 1) + } + } else { + for (i in fromPosition downTo toPosition + 1) { + Collections.swap(items, i, i - 1) + } + } + notifyItemMoved(fromPosition, toPosition) + } + + override fun onRowSelected(myViewHolder: ViewHolder?) { + } + + override fun onRowClear(myViewHolder: ViewHolder?) { + listener?.saveChecklist() + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/interfaces/ItemMoveCallback.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/interfaces/ItemMoveCallback.kt new file mode 100644 index 00000000..5d2cb329 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/interfaces/ItemMoveCallback.kt @@ -0,0 +1,39 @@ +package com.simplemobiletools.notes.pro.interfaces + +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView +import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter + +open class ItemMoveCallback(private val mAdapter: ItemTouchHelperContract) : ItemTouchHelper.Callback() { + override fun isLongPressDragEnabled() = false + + override fun isItemViewSwipeEnabled() = false + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, i: Int) {} + + 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 { + mAdapter.onRowMoved(viewHolder.adapterPosition, target.adapterPosition) + return true + } + + override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { + if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { + if (viewHolder is MyRecyclerViewAdapter.ViewHolder) { + mAdapter.onRowSelected(viewHolder) + } + } + super.onSelectedChanged(viewHolder, actionState) + } + + override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { + super.clearView(recyclerView, viewHolder) + if (viewHolder is MyRecyclerViewAdapter.ViewHolder) { + mAdapter.onRowClear(viewHolder) + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/interfaces/ItemTouchHelperContract.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/interfaces/ItemTouchHelperContract.kt new file mode 100644 index 00000000..5c2e1627 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/interfaces/ItemTouchHelperContract.kt @@ -0,0 +1,11 @@ +package com.simplemobiletools.notes.pro.interfaces + +import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter + +interface ItemTouchHelperContract { + fun onRowMoved(fromPosition: Int, toPosition: Int) + + fun onRowSelected(myViewHolder: MyRecyclerViewAdapter.ViewHolder?) + + fun onRowClear(myViewHolder: MyRecyclerViewAdapter.ViewHolder?) +} diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/interfaces/StartReorderDragListener.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/interfaces/StartReorderDragListener.kt new file mode 100644 index 00000000..ea9b6d26 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/interfaces/StartReorderDragListener.kt @@ -0,0 +1,7 @@ +package com.simplemobiletools.notes.pro.interfaces + +import androidx.recyclerview.widget.RecyclerView + +interface StartReorderDragListener { + fun requestDrag(viewHolder: RecyclerView.ViewHolder) +}