12
12
import android .util .Log ;
13
13
14
14
import androidx .activity .EdgeToEdge ;
15
+ import androidx .annotation .NonNull ;
15
16
import androidx .appcompat .app .AppCompatActivity ;
16
17
import androidx .core .graphics .Insets ;
17
18
import androidx .core .view .ViewCompat ;
18
19
import androidx .core .view .WindowInsetsCompat ;
19
20
import androidx .recyclerview .widget .GridLayoutManager ;
21
+ import androidx .recyclerview .widget .ItemTouchHelper ;
22
+ import androidx .recyclerview .widget .RecyclerView ;
20
23
21
24
import com .leshoraa .listshop .adapter .GridSpacingItemDecoration ;
22
25
import com .leshoraa .listshop .adapter .ItemAdapter ;
23
26
import com .leshoraa .listshop .model .DatabaseHelper ;
24
27
import com .leshoraa .listshop .model .Item ;
25
28
import com .leshoraa .listshop .databinding .ActivityMainBinding ;
29
+ import com .leshoraa .listshop .model .DateHeader ;
26
30
27
31
import java .text .SimpleDateFormat ;
28
32
import java .util .ArrayList ;
@@ -39,9 +43,10 @@ public class MainActivity extends AppCompatActivity {
39
43
private ActivityMainBinding binding ;
40
44
private ItemAdapter adapter ;
41
45
private DatabaseHelper dbHelper ;
46
+ private ItemTouchHelper itemTouchHelper ;
42
47
43
48
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 ());
45
50
public static final SimpleDateFormat UI_DATE_FORMAT_DISPLAY = new SimpleDateFormat ("dd/MM" , Locale .getDefault ());
46
51
47
52
public static final String EXTRA_ITEM_ID = "extra_item_id" ;
@@ -94,7 +99,7 @@ protected void onCreate(Bundle savedInstanceState) {
94
99
binding .rv .setHasFixedSize (true );
95
100
binding .rv .addItemDecoration (new GridSpacingItemDecoration (numberOfColumns , 16 ));
96
101
97
- adapter = new ItemAdapter (new ArrayList <>(), null , null , this );
102
+ adapter = new ItemAdapter (new ArrayList <>(), null , null , this , itemTouchHelper );
98
103
binding .rv .setAdapter (adapter );
99
104
100
105
adapter .addItemClickListener = () -> {
@@ -112,16 +117,13 @@ protected void onCreate(Bundle savedInstanceState) {
112
117
dbHelper .deleteMarket (marketId );
113
118
Log .d (TAG , "deleteItemClickListener (for Market): Database delete attempt finished. Loading items..." );
114
119
loadItems ();
115
- Log .d (TAG , "deleteItemClickListener (for Market): Items reloaded. Setting focused position to -1." );
116
- adapter .setFocusedPosition (-1 );
117
120
};
118
121
119
122
adapter .setOnDeleteListItemClickListener (itemId -> {
120
123
Log .d (TAG , "onDeleteListItemClick (for Item): Deleting item from DB with ID: " + itemId );
121
124
dbHelper .deleteItem (itemId );
122
125
});
123
126
124
-
125
127
adapter .setOnItemClickListener (itemId -> {
126
128
Intent intent = new Intent (MainActivity .this , ListActivity .class );
127
129
intent .putExtra (EXTRA_ITEM_ID , itemId );
@@ -138,6 +140,77 @@ public int getSpanSize(int position) {
138
140
}
139
141
});
140
142
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
+
141
214
loadItems ();
142
215
updateDateRangeDisplay ();
143
216
}
0 commit comments