Skip to content

Commit 0fa8db9

Browse files
author
Leshoraa
committed
feat: Implement reordering for market list items
This commit introduces drag-and-drop functionality for reordering market list items in the main RecyclerView. Users can now long-press and drag market items to change their position, allowing them to organize their market lists from older to newer dates or any preferred order. The reordered positions are persisted in the database, ensuring that the user's custom arrangement is maintained across app sessions.
1 parent d4b1c8e commit 0fa8db9

File tree

4 files changed

+294
-153
lines changed

4 files changed

+294
-153
lines changed

app/src/main/java/com/leshoraa/listshop/MainActivity.java

Lines changed: 78 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,21 @@
1212
import android.util.Log;
1313

1414
import androidx.activity.EdgeToEdge;
15+
import androidx.annotation.NonNull;
1516
import androidx.appcompat.app.AppCompatActivity;
1617
import androidx.core.graphics.Insets;
1718
import androidx.core.view.ViewCompat;
1819
import androidx.core.view.WindowInsetsCompat;
1920
import androidx.recyclerview.widget.GridLayoutManager;
21+
import androidx.recyclerview.widget.ItemTouchHelper;
22+
import androidx.recyclerview.widget.RecyclerView;
2023

2124
import com.leshoraa.listshop.adapter.GridSpacingItemDecoration;
2225
import com.leshoraa.listshop.adapter.ItemAdapter;
2326
import com.leshoraa.listshop.model.DatabaseHelper;
2427
import com.leshoraa.listshop.model.Item;
2528
import com.leshoraa.listshop.databinding.ActivityMainBinding;
29+
import com.leshoraa.listshop.model.DateHeader;
2630

2731
import java.text.SimpleDateFormat;
2832
import java.util.ArrayList;
@@ -39,9 +43,10 @@ public class MainActivity extends AppCompatActivity {
3943
private ActivityMainBinding binding;
4044
private ItemAdapter adapter;
4145
private DatabaseHelper dbHelper;
46+
private ItemTouchHelper itemTouchHelper;
4247

4348
public static final SimpleDateFormat DB_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
44-
public static final SimpleDateFormat UI_DATE_FORMAT = new SimpleDateFormat("dd MMMM yyyy", Locale.getDefault());
49+
public static final SimpleDateFormat UI_DATE_FORMAT = new SimpleDateFormat("dd MMMM", Locale.getDefault());
4550
public static final SimpleDateFormat UI_DATE_FORMAT_DISPLAY = new SimpleDateFormat("dd/MM", Locale.getDefault());
4651

4752
public static final String EXTRA_ITEM_ID = "extra_item_id";
@@ -94,7 +99,7 @@ protected void onCreate(Bundle savedInstanceState) {
9499
binding.rv.setHasFixedSize(true);
95100
binding.rv.addItemDecoration(new GridSpacingItemDecoration(numberOfColumns, 16));
96101

97-
adapter = new ItemAdapter(new ArrayList<>(), null, null, this);
102+
adapter = new ItemAdapter(new ArrayList<>(), null, null, this, itemTouchHelper);
98103
binding.rv.setAdapter(adapter);
99104

100105
adapter.addItemClickListener = () -> {
@@ -112,16 +117,13 @@ protected void onCreate(Bundle savedInstanceState) {
112117
dbHelper.deleteMarket(marketId);
113118
Log.d(TAG, "deleteItemClickListener (for Market): Database delete attempt finished. Loading items...");
114119
loadItems();
115-
Log.d(TAG, "deleteItemClickListener (for Market): Items reloaded. Setting focused position to -1.");
116-
adapter.setFocusedPosition(-1);
117120
};
118121

119122
adapter.setOnDeleteListItemClickListener(itemId -> {
120123
Log.d(TAG, "onDeleteListItemClick (for Item): Deleting item from DB with ID: " + itemId);
121124
dbHelper.deleteItem(itemId);
122125
});
123126

124-
125127
adapter.setOnItemClickListener(itemId -> {
126128
Intent intent = new Intent(MainActivity.this, ListActivity.class);
127129
intent.putExtra(EXTRA_ITEM_ID, itemId);
@@ -138,6 +140,77 @@ public int getSpanSize(int position) {
138140
}
139141
});
140142

143+
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(
144+
// Izinkan drag ke semua arah (atas, bawah, kiri, kanan)
145+
ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT,
146+
0 // Tidak ada swipe untuk saat ini
147+
) {
148+
@Override
149+
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
150+
int dragFlags = 0;
151+
if (viewHolder.getItemViewType() == ItemAdapter.VIEW_TYPE_ITEM) {
152+
// Hanya item non-AddButton yang bisa di-drag
153+
Item item = (Item) adapter.getCombinedList().get(viewHolder.getAdapterPosition());
154+
if (!item.isAddButton()) {
155+
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
156+
}
157+
}
158+
return makeMovementFlags(dragFlags, 0);
159+
}
160+
161+
@Override
162+
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
163+
int fromPosition = viewHolder.getAdapterPosition();
164+
int toPosition = target.getAdapterPosition();
165+
166+
// Pastikan target juga adalah VIEW_TYPE_ITEM dan bukan AddButton atau Header
167+
if (viewHolder.getItemViewType() != ItemAdapter.VIEW_TYPE_ITEM ||
168+
target.getItemViewType() != ItemAdapter.VIEW_TYPE_ITEM) {
169+
return false;
170+
}
171+
172+
// Jangan izinkan drag ke atau dari AddButton
173+
if (((Item) adapter.getCombinedList().get(fromPosition)).isAddButton() ||
174+
((Item) adapter.getCombinedList().get(toPosition)).isAddButton()) {
175+
return false;
176+
}
177+
178+
adapter.onItemMove(fromPosition, toPosition);
179+
return true;
180+
}
181+
182+
@Override
183+
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
184+
// Tidak melakukan apa-apa untuk swipe saat ini
185+
}
186+
187+
@Override
188+
public void onSelectedChanged(@NonNull RecyclerView.ViewHolder viewHolder, int actionState) {
189+
super.onSelectedChanged(viewHolder, actionState);
190+
if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
191+
if (viewHolder instanceof ItemAdapter.ItemViewHolder) {
192+
((ItemAdapter.ItemViewHolder) viewHolder).startJiggleAnimation();
193+
}
194+
}
195+
}
196+
197+
@Override
198+
public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
199+
super.clearView(recyclerView, viewHolder);
200+
201+
if (viewHolder instanceof ItemAdapter.ItemViewHolder) {
202+
((ItemAdapter.ItemViewHolder) viewHolder).stopJiggleAnimation();
203+
}
204+
205+
// Panggil saveItemOrderToDatabase setelah drag selesai dan dilepas
206+
adapter.saveItemOrderToDatabase();
207+
}
208+
};
209+
210+
itemTouchHelper = new ItemTouchHelper(simpleCallback);
211+
itemTouchHelper.attachToRecyclerView(binding.rv);
212+
adapter.setItemTouchHelper(itemTouchHelper);
213+
141214
loadItems();
142215
updateDateRangeDisplay();
143216
}

0 commit comments

Comments
 (0)