From d4245c590689d9e3989d53c1f84a21fe65e0a60c Mon Sep 17 00:00:00 2001 From: riz081 Date: Fri, 13 Jun 2025 09:29:35 +0700 Subject: [PATCH] Sorting List --- .../example/bdkipoc/TransactionActivity.java | 57 +++++++++++-------- .../main/res/layout/activity_transaction.xml | 49 ++++++++++------ 2 files changed, 63 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/com/example/bdkipoc/TransactionActivity.java b/app/src/main/java/com/example/bdkipoc/TransactionActivity.java index e623979..5d0e01b 100644 --- a/app/src/main/java/com/example/bdkipoc/TransactionActivity.java +++ b/app/src/main/java/com/example/bdkipoc/TransactionActivity.java @@ -45,6 +45,7 @@ import java.util.Date; import java.util.Locale; import java.util.Calendar; import java.util.Collections; +import java.util.TimeZone; import android.app.DatePickerDialog; import android.widget.DatePicker; @@ -445,13 +446,13 @@ public class TransactionActivity extends AppCompatActivity implements Transactio filteredList.clear(); if (query.isEmpty()) { - // ✅ NO SEARCH: Show current API page data (already sorted) + // ✅ NO SEARCH: Show current API page data (maintain sorting from API) filteredList.addAll(transactionList); totalRecords = totalRecords; // Use API total totalPages = (int) Math.ceil((double) totalRecords / itemsPerPage); - // ✅ VERIFY FILTERED LIST ORDER - Log.d("TransactionActivity", "📋 FILTERED LIST ORDER (no search):"); + // ✅ PASTIKAN TIDAK PERLU SORT LAGI karena sudah sorted dari API response + Log.d("TransactionActivity", "📋 FILTERED LIST ORDER (no search - maintaining API order):"); for (int i = 0; i < Math.min(5, filteredList.size()); i++) { Transaction tx = filteredList.get(i); Log.d("TransactionActivity", " " + (i+1) + ". " + tx.createdAt + " - " + tx.referenceId); @@ -465,7 +466,7 @@ public class TransactionActivity extends AppCompatActivity implements Transactio } } - // ✅ SORT SEARCH RESULTS by date + // ✅ SORT SEARCH RESULTS by date (maintaining newest first) Collections.sort(filteredList, (t1, t2) -> { try { Date date1 = parseCreatedAtDate(t1.createdAt); @@ -687,7 +688,7 @@ public class TransactionActivity extends AppCompatActivity implements Transactio if (error) { Toast.makeText(TransactionActivity.this, "Failed to fetch transactions", Toast.LENGTH_SHORT).show(); - updatePaginationDisplay(); // Show current state even on error + updatePaginationDisplay(); return; } @@ -696,33 +697,33 @@ public class TransactionActivity extends AppCompatActivity implements Transactio totalRecords = apiTotal; totalPages = (int) Math.ceil((double) totalRecords / itemsPerPage); - // ✅ UPDATE TRANSACTION LIST - transactionList.clear(); - transactionList.addAll(transactions); - - // ✅ CRITICAL: FORCE SORT AGAIN after adding to main list - Collections.sort(filteredList, (t1, t2) -> { + // ✅ PERBAIKAN SORTING: Sort transactions SEBELUM menambahkan ke list + Collections.sort(transactions, (t1, t2) -> { try { Date date1 = parseCreatedAtDate(t1.createdAt); Date date2 = parseCreatedAtDate(t2.createdAt); if (date1 != null && date2 != null) { int comparison = date2.compareTo(date1); // Newest first - Log.d("TransactionActivity", "🔄 Final sort: " + t1.createdAt + " vs " + t2.createdAt + " = " + comparison); + Log.d("TransactionActivity", "🔄 Sorting: " + t2.createdAt + " vs " + t1.createdAt + " = " + comparison); return comparison; } } catch (Exception e) { Log.w("TransactionActivity", "Date comparison error: " + e.getMessage()); } - return Integer.compare(t2.id, t1.id); // Fallback by ID + return Integer.compare(t2.id, t1.id); // Fallback by ID (higher ID = newer) }); + // ✅ UPDATE TRANSACTION LIST dengan data yang sudah tersortir + transactionList.clear(); + transactionList.addAll(transactions); + Log.d("TransactionActivity", "📋 Page " + currentPage + " loaded and sorted: " + transactions.size() + " transactions. Total: " + totalRecords + "/" + totalPages + " pages"); - // ✅ LOG FINAL ORDER VERIFICATION - Log.d("TransactionActivity", "📋 FINAL DISPLAY ORDER:"); - for (int i = 0; i < Math.min(10, transactionList.size()); i++) { + // ✅ VERIFIKASI SORTING ORDER + Log.d("TransactionActivity", "📋 SORTED ORDER VERIFICATION:"); + for (int i = 0; i < Math.min(5, transactionList.size()); i++) { Transaction tx = transactionList.get(i); Log.d("TransactionActivity", " " + (i+1) + ". " + tx.createdAt + " - " + tx.referenceId); } @@ -745,19 +746,23 @@ public class TransactionActivity extends AppCompatActivity implements Transactio return null; } - // List of possible date formats from API + // List of possible date formats from API (urutan dari yang paling spesifik) String[] possibleFormats = { - "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", // ISO format with milliseconds - "yyyy-MM-dd'T'HH:mm:ss'Z'", // ISO format without milliseconds - "yyyy-MM-dd HH:mm:ss.SSS", // Standard format with milliseconds - "yyyy-MM-dd HH:mm:ss", // Standard format - "yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'" // ISO format with microseconds + "yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'", // ISO format with microseconds (6 digits) + "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", // ISO format with milliseconds (3 digits) + "yyyy-MM-dd'T'HH:mm:ss'Z'", // ISO format without milliseconds + "yyyy-MM-dd HH:mm:ss.SSSSSS", // Standard format with microseconds + "yyyy-MM-dd HH:mm:ss.SSS", // Standard format with milliseconds + "yyyy-MM-dd HH:mm:ss" // Standard format }; for (String format : possibleFormats) { try { SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.getDefault()); - return sdf.parse(rawDate); + sdf.setTimeZone(TimeZone.getTimeZone("UTC")); // Handle timezone properly + Date parsed = sdf.parse(rawDate); + Log.d("TransactionActivity", "✅ Date parsed successfully: " + rawDate + " -> " + parsed + " using format: " + format); + return parsed; } catch (Exception e) { // Continue to next format } @@ -773,9 +778,11 @@ public class TransactionActivity extends AppCompatActivity implements Transactio } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); - return sdf.parse(cleanedDate); + Date parsed = sdf.parse(cleanedDate); + Log.d("TransactionActivity", "✅ Date parsed with fallback: " + rawDate + " -> " + parsed); + return parsed; } catch (Exception e) { - Log.w("TransactionActivity", "❌ Could not parse date: " + rawDate); + Log.w("TransactionActivity", "❌ Could not parse date: " + rawDate + " - Error: " + e.getMessage()); return null; } } diff --git a/app/src/main/res/layout/activity_transaction.xml b/app/src/main/res/layout/activity_transaction.xml index b1c3e30..71f0364 100644 --- a/app/src/main/res/layout/activity_transaction.xml +++ b/app/src/main/res/layout/activity_transaction.xml @@ -87,6 +87,7 @@ + + + android:background="#ffffff" + android:clipToPadding="false" + android:paddingBottom="8dp" /> - + + android:elevation="4dp" + android:visibility="gone" + android:layout_marginTop="2dp"> + android:scaleType="centerInside" + android:background="?android:attr/selectableItemBackgroundBorderless" /> + android:scaleType="centerInside" + android:background="?android:attr/selectableItemBackgroundBorderless" /> + android:layout_marginRight="8dp" + android:minHeight="48dp" /> + android:scaleType="centerInside" + android:background="?android:attr/selectableItemBackgroundBorderless" /> + android:scaleType="centerInside" + android:background="?android:attr/selectableItemBackgroundBorderless" />