mirror of
https://github.com/SimpleMobileTools/Simple-Notes.git
synced 2025-03-26 13:30:10 +01:00
fix #265, allow reordering checklist items by dragging them
This commit is contained in:
parent
11155ee12a
commit
0b81d11c9a
app/src/main/kotlin/com/simplemobiletools/notes/pro
@ -4,8 +4,11 @@ import android.graphics.Paint
|
|||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
|
import android.view.MotionEvent
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import androidx.recyclerview.widget.ItemTouchHelper
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
||||||
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
|
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
|
||||||
import com.simplemobiletools.commons.extensions.applyColorFilter
|
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.extensions.getTextSize
|
||||||
import com.simplemobiletools.notes.pro.helpers.DONE_CHECKLIST_ITEM_ALPHA
|
import com.simplemobiletools.notes.pro.helpers.DONE_CHECKLIST_ITEM_ALPHA
|
||||||
import com.simplemobiletools.notes.pro.interfaces.ChecklistItemsListener
|
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 com.simplemobiletools.notes.pro.models.ChecklistItem
|
||||||
import kotlinx.android.synthetic.main.item_checklist.view.*
|
import kotlinx.android.synthetic.main.item_checklist.view.*
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class ChecklistAdapter(activity: BaseSimpleActivity, var items: ArrayList<ChecklistItem>, val listener: ChecklistItemsListener?,
|
class ChecklistAdapter(activity: BaseSimpleActivity, var items: ArrayList<ChecklistItem>, val listener: ChecklistItemsListener?,
|
||||||
recyclerView: MyRecyclerView, val showIcons: Boolean, itemClick: (Any) -> Unit) :
|
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 crossDrawable: Drawable
|
||||||
private lateinit var checkDrawable: Drawable
|
private lateinit var checkDrawable: Drawable
|
||||||
|
private var touchHelper: ItemTouchHelper? = null
|
||||||
|
private var startReorderDragListener: StartReorderDragListener
|
||||||
|
|
||||||
init {
|
init {
|
||||||
setupDragListener(true)
|
setupDragListener(true)
|
||||||
initDrawables()
|
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
|
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) {
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
val item = items[position]
|
val item = items[position]
|
||||||
holder.bindView(item, true, true) { itemView, layoutPosition ->
|
holder.bindView(item, true, true) { itemView, layoutPosition ->
|
||||||
setupView(itemView, item)
|
setupView(itemView, item, holder)
|
||||||
}
|
}
|
||||||
bindViewHolder(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 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)
|
val isSelected = selectedKeys.contains(checklistItem.id)
|
||||||
view.apply {
|
view.apply {
|
||||||
checklist_title.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.setImageDrawable(if (checklistItem.isDone) checkDrawable else crossDrawable)
|
||||||
checklist_image.beVisibleIf(showIcons)
|
checklist_image.beVisibleIf(showIcons)
|
||||||
|
checklist_holder.isSelected = isSelected
|
||||||
|
|
||||||
checklist_drag_handle.beVisibleIf(selectedKeys.isNotEmpty())
|
checklist_drag_handle.beVisibleIf(selectedKeys.isNotEmpty())
|
||||||
checklist_drag_handle.applyColorFilter(textColor)
|
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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
app/src/main/kotlin/com/simplemobiletools/notes/pro/interfaces/ItemTouchHelperContract.kt
Normal file
11
app/src/main/kotlin/com/simplemobiletools/notes/pro/interfaces/ItemTouchHelperContract.kt
Normal 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?)
|
||||||
|
}
|
7
app/src/main/kotlin/com/simplemobiletools/notes/pro/interfaces/StartReorderDragListener.kt
Normal file
7
app/src/main/kotlin/com/simplemobiletools/notes/pro/interfaces/StartReorderDragListener.kt
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package com.simplemobiletools.notes.pro.interfaces
|
||||||
|
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
|
||||||
|
interface StartReorderDragListener {
|
||||||
|
fun requestDrag(viewHolder: RecyclerView.ViewHolder)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user