From 342262e892f9778e6cfa09a4c607d6e58c23e355 Mon Sep 17 00:00:00 2001 From: Marvin Date: Tue, 17 Mar 2026 19:41:37 -0300 Subject: [PATCH] Feature: Add drag-and-drop reordering for checklist items Users can now reorder checklist items by dragging them up or down using the drag handle icon (6-dot pattern) on each item. Changes: - Added ic_drag_handle.xml drawable with 6-dot pattern icon - Updated item_checklist_row.xml to include drag handle ImageButton - Modified ChecklistAdapter to support moveItem() operation - Added ItemTouchHelper in NoteEditorFragment for drag-and-drop functionality - Items reorder smoothly and changes are auto-saved --- .../notesapp/adapters/ChecklistAdapter.java | 22 +++++++++++++ .../fragments/NoteEditorFragment.java | 28 ++++++++++++++++ app/src/main/res/drawable/ic_drag_handle.xml | 32 +++++++++++++++++++ .../main/res/layout/item_checklist_row.xml | 13 +++++++- 4 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/ic_drag_handle.xml diff --git a/app/src/main/java/com/notesapp/adapters/ChecklistAdapter.java b/app/src/main/java/com/notesapp/adapters/ChecklistAdapter.java index 926c32f..a746f05 100644 --- a/app/src/main/java/com/notesapp/adapters/ChecklistAdapter.java +++ b/app/src/main/java/com/notesapp/adapters/ChecklistAdapter.java @@ -23,6 +23,7 @@ public class ChecklistAdapter extends RecyclerView.Adapter toPosition; i--) { + ChecklistItem temp = items.get(i); + items.set(i, items.get(i - 1)); + items.set(i - 1, temp); + } + } + + notifyItemMoved(fromPosition, toPosition); + } + static class ChecklistViewHolder extends RecyclerView.ViewHolder { + ImageButton dragHandle; CheckBox checkBox; EditText editText; ImageButton deleteButton; public ChecklistViewHolder(@NonNull View itemView) { super(itemView); + dragHandle = itemView.findViewById(R.id.drag_handle); checkBox = itemView.findViewById(R.id.check_box); editText = itemView.findViewById(R.id.item_text); deleteButton = itemView.findViewById(R.id.delete_button); diff --git a/app/src/main/java/com/notesapp/fragments/NoteEditorFragment.java b/app/src/main/java/com/notesapp/fragments/NoteEditorFragment.java index 8ad01a0..5ddc73c 100644 --- a/app/src/main/java/com/notesapp/fragments/NoteEditorFragment.java +++ b/app/src/main/java/com/notesapp/fragments/NoteEditorFragment.java @@ -14,6 +14,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -175,12 +176,39 @@ public class NoteEditorFragment extends Fragment { updateProgress(); saveNoteImmediately(); } + + @Override + public void onMoveItems(int fromPosition, int toPosition) { + scheduleSave(); + } }); checklistAdapter.setItems(note.getItems()); checklistRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); checklistRecyclerView.setAdapter(checklistAdapter); + // Add drag-and-drop support + ItemTouchHelper itemTouchHelper = new ItemTouchHelper( + new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, 0) { + @Override + public boolean onMove(@NonNull RecyclerView recyclerView, + @NonNull RecyclerView.ViewHolder viewHolder, + @NonNull RecyclerView.ViewHolder target) { + int fromPosition = viewHolder.getAdapterPosition(); + int toPosition = target.getAdapterPosition(); + + checklistAdapter.moveItem(fromPosition, toPosition); + scheduleSave(); + + return true; + } + + @Override + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {} + }); + + itemTouchHelper.attachToRecyclerView(checklistRecyclerView); + addImageButton.setOnClickListener(v -> { ChecklistItem newItem = new ChecklistItem(""); note.getItems().add(newItem); diff --git a/app/src/main/res/drawable/ic_drag_handle.xml b/app/src/main/res/drawable/ic_drag_handle.xml new file mode 100644 index 0000000..314f7c8 --- /dev/null +++ b/app/src/main/res/drawable/ic_drag_handle.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_checklist_row.xml b/app/src/main/res/layout/item_checklist_row.xml index 2044bf8..3eb5cd6 100644 --- a/app/src/main/res/layout/item_checklist_row.xml +++ b/app/src/main/res/layout/item_checklist_row.xml @@ -1,16 +1,27 @@ + + + android:layout_gravity="center_vertical" + android:layout_marginStart="4dp" />