fix #265, allow reordering checklist items by dragging them

This commit is contained in:
tibbi 2019-12-08 19:51:27 +01:00
parent 11155ee12a
commit 0b81d11c9a
4 changed files with 104 additions and 4 deletions

View File

@ -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<ChecklistItem>, 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<Checkl
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = items[position]
holder.bindView(item, true, true) { itemView, layoutPosition ->
setupView(itemView, item)
setupView(itemView, item, holder)
}
bindViewHolder(holder)
}
@ -130,7 +147,7 @@ class ChecklistAdapter(activity: BaseSimpleActivity, var items: ArrayList<Checkl
private fun getSelectedItems() = items.filter { selectedKeys.contains(it.id) } as ArrayList<ChecklistItem>
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<Checkl
checklist_image.setImageDrawable(if (checklistItem.isDone) checkDrawable else crossDrawable)
checklist_image.beVisibleIf(showIcons)
checklist_holder.isSelected = isSelected
checklist_drag_handle.beVisibleIf(selectedKeys.isNotEmpty())
checklist_drag_handle.applyColorFilter(textColor)
checklist_holder.isSelected = isSelected
checklist_drag_handle.setOnTouchListener { v, event ->
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()
}
}

View File

@ -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)
}
}
}

View File

@ -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?)
}

View File

@ -0,0 +1,7 @@
package com.simplemobiletools.notes.pro.interfaces
import androidx.recyclerview.widget.RecyclerView
interface StartReorderDragListener {
fun requestDrag(viewHolder: RecyclerView.ViewHolder)
}