diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanResultAdapter.kt b/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanResultAdapter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..5dbc23851049ce167a5cdcb1e55d017d73c1b183
--- /dev/null
+++ b/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanResultAdapter.kt
@@ -0,0 +1,43 @@
+package com.example.bandung_bondowoso.view.scan
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.example.bandung_bondowoso.R
+import com.example.bandung_bondowoso.model.Item
+
+class ScanResultAdapter(var itemList: List<Item>):
+    RecyclerView.Adapter<ScanResultAdapter.ScanResultViewHolder>() {
+
+    inner class ScanResultViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+        val tvImageIcon: View = view.findViewById(R.id.img_icon_result_transaction)
+        val tvScanItem : TextView = view.findViewById(R.id.tv_scan_transaction_item)
+        val tvQuantity: TextView = view.findViewById(R.id.tv_transaction_quantity)
+        val tvPrice : TextView = view.findViewById(R.id.tv_scan_transaction_amount)
+    }
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ScanResultAdapter.ScanResultViewHolder {
+        val view = LayoutInflater.from(parent.context).
+        inflate(R.layout.scan_result_item, parent, false)
+        return ScanResultViewHolder(view)
+    }
+
+    override fun onBindViewHolder(holder: ScanResultAdapter.ScanResultViewHolder, position: Int) {
+        val item = itemList[position]
+        val imageResource =  R.drawable.ic_money_bill_wave
+        Glide.with(holder.itemView.context)
+            .load(imageResource)
+            .into(holder.tvImageIcon as ImageView)
+        holder.tvScanItem.text = item.name
+        holder.tvPrice.text = item.price.toString()
+        holder.tvQuantity.text = (item.qty.toString() + " item")
+    }
+
+    override fun getItemCount(): Int {
+        return itemList.size
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanResultFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanResultFragment.kt
index 8166750b5276a128d25a5b380df37f867a311996..d2d6513c964b7d47ad24fd4a3796f2d250238c48 100644
--- a/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanResultFragment.kt
+++ b/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanResultFragment.kt
@@ -12,10 +12,12 @@ import androidx.fragment.app.viewModels
 import androidx.lifecycle.ViewModelProvider
 import androidx.localbroadcastmanager.content.LocalBroadcastManager
 import androidx.navigation.Navigation
+import androidx.recyclerview.widget.LinearLayoutManager
 import com.example.bandung_bondowoso.BandungBondowosoApp
 import com.example.bandung_bondowoso.R
 import com.example.bandung_bondowoso.broadcast.randomize_transaction.RandomizeTransactionReceiver
 import com.example.bandung_bondowoso.databinding.FragmentScanResultBinding
+import com.example.bandung_bondowoso.model.Item
 import com.example.bandung_bondowoso.model.TransactionCategory
 import com.example.bandung_bondowoso.viewmodel.login.LoginViewModel
 import com.example.bandung_bondowoso.viewmodel.login.LoginViewModelFactory
@@ -29,6 +31,8 @@ import java.io.File
 class ScanResultFragment: Fragment() {
     private var _binding: FragmentScanResultBinding ? = null
     private val binding get() = _binding!!
+    private var itemList = listOf<Item>()
+    private lateinit var adapter: ScanResultAdapter
     private lateinit var randomizeTransactionViewModel: RandomizeTransactionViewModel
 
 
@@ -56,7 +60,8 @@ class ScanResultFragment: Fragment() {
         binding.buttonUlang.setOnClickListener {
             Navigation.findNavController(root).navigate(R.id.action_navigation_result_to_scan)
         }
-        binding.testAja.text = "Waiting for result..."
+        binding.repeatContainer.visibility = View.GONE
+        binding.rvTransactionScan.visibility = View.GONE
         binding.buttonTidakUlang.setOnClickListener{
             var tempName= ""
             var tempAmount = 0.00
@@ -84,14 +89,27 @@ class ScanResultFragment: Fragment() {
         var token: String?
         var file: File?
 
+        adapter = ScanResultAdapter(itemList)
+        binding.rvTransactionScan.adapter= adapter
+        binding.rvTransactionScan.layoutManager = LinearLayoutManager(context)
+        binding.repeatContainer.visibility = View.GONE
+        binding.rvTransactionScan.visibility = View.GONE
+
         scanViewModel.uploadResult.observe(viewLifecycleOwner) { uploadResult ->
-            var temp = ""
-            uploadResult?.items?.items?.forEach { item ->
-                temp += "Item : ${item.name} \n"
-                temp += "Quantity : ${item.qty} \n"
-                temp += "Price : ${item.price} \n \n"
+            itemList = uploadResult?.items?.items!!
+            if(itemList.isEmpty()){
+                binding.clEmptyRvScan.visibility = View.VISIBLE
+                binding.rvTransactionScan.visibility = View.GONE
+
+            }else{
+                adapter = ScanResultAdapter(itemList)
+                binding.rvTransactionScan.adapter = adapter
+
             }
-            binding.testAja.text = temp.trim()
+            binding.repeatContainer.visibility = View.VISIBLE
+            binding.testAja.visibility = View.GONE
+            binding.rvTransactionScan.visibility = View.VISIBLE
+
         }
         file = scanViewModel.getUploadFile()
         loginViewModel.getToken().observe(viewLifecycleOwner) { userToken ->
@@ -104,6 +122,13 @@ class ScanResultFragment: Fragment() {
         }
 
     }
+    override fun onResume(){
+        super.onResume()
+        binding.repeatContainer.visibility = View.GONE
+        binding.testAja.visibility = View.VISIBLE
+        binding.rvTransactionScan.visibility = View.GONE
+    }
+
 
     override fun onDestroyView() {
         super.onDestroyView()
diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/setting/SettingFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/setting/SettingFragment.kt
index d2b94d06821cde8722b613ed8852793a86ae8f97..83bca950e4c6f0c44c5f8ef5ea9b9633c5e6f67d 100644
--- a/app/src/main/java/com/example/bandung_bondowoso/view/setting/SettingFragment.kt
+++ b/app/src/main/java/com/example/bandung_bondowoso/view/setting/SettingFragment.kt
@@ -37,6 +37,9 @@ import kotlinx.coroutines.withContext
 import org.apache.poi.xssf.usermodel.XSSFWorkbook
 import java.io.File
 import java.io.FileOutputStream
+import java.text.SimpleDateFormat
+import java.util.Date
+import java.util.Locale
 
 class SettingFragment : Fragment(), ConnectionChangeListener {
     private var _binding: FragmentSettingsBinding? = null
@@ -103,7 +106,7 @@ class SettingFragment : Fragment(), ConnectionChangeListener {
 
     }
 
-    fun saveFile(workbook:XSSFWorkbook, fileName: String, isXls: Boolean) {
+    fun saveFile(workbook:XSSFWorkbook, isXls: Boolean) {
         lifecycleScope.launch {
             withContext(Dispatchers.IO) {
 
@@ -111,6 +114,10 @@ class SettingFragment : Fragment(), ConnectionChangeListener {
                 if (!isXls) {
                     type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
                 }
+                val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.getDefault()).format(Date())
+                // Append the timestamp to the base file name or replace it entirely
+                val fileName = "excel_file$timeStamp"
+
 
                 val contentValues = ContentValues().apply {
                     put(MediaStore.MediaColumns.DISPLAY_NAME, "$fileName")
@@ -172,10 +179,10 @@ class SettingFragment : Fragment(), ConnectionChangeListener {
 
         }
         binding.buttonSaveExcelXls.setOnClickListener {
-            saveFile(createFile(), "test", true)
+            saveFile(createFile(), true)
         }
         binding.buttonSaveExcelXlsx.setOnClickListener {
-            saveFile(createFile(), "test", false)
+            saveFile(createFile(), false)
         }
 
         binding.buttonLogOut.setOnClickListener {
diff --git a/app/src/main/res/layout/fragment_scan_result.xml b/app/src/main/res/layout/fragment_scan_result.xml
index 9f41487f8f3f8b330af17012d275b69ad02ec09b..60d9bac56570070158a20d6cfbcc21dc449e8ab0 100644
--- a/app/src/main/res/layout/fragment_scan_result.xml
+++ b/app/src/main/res/layout/fragment_scan_result.xml
@@ -15,7 +15,7 @@
         android:layout_height="wrap_content"
         android:layout_marginStart="30dp"
         android:layout_marginTop="20dp"
-        android:text="Hasil Scan"
+        android:text="@string/hasil_scan"
         android:textColor="@color/white"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
@@ -25,7 +25,7 @@
         android:layout_height="430dp"
         android:layout_marginStart="30dp"
         android:layout_marginEnd="30dp"
-        android:layout_marginTop="20dp"
+        android:layout_marginTop="15dp"
         android:orientation="vertical"
 
         app:layout_constraintStart_toStartOf="parent"
@@ -34,21 +34,23 @@
             android:id= "@+id/test_aja"
             android:textColor="@color/white"
             android:layout_width="match_parent"
-            android:layout_height="match_parent"
+            android:layout_height="wrap_content"
+            android:text = "@string/waiting_for_result"
             />
-<!--        <androidx.recyclerview.widget.RecyclerView-->
-<!--            android:id="@+id/rvTransaction"-->
-<!--            android:layout_width="match_parent"-->
-<!--            android:layout_height="match_parent"-->
-<!--            app:layout_constraintEnd_toEndOf="parent"-->
-<!--            app:layout_constraintStart_toStartOf="parent"-->
-<!--            app:layout_constraintTop_toTopOf="parent" />-->
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/rvTransactionScan"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
 
     </LinearLayout>
 
     <LinearLayout
+        android:id= "@+id/repeat_container"
         android:layout_width="match_parent"
-        android:layout_height="180dp"
+        android:layout_height="120dp"
         android:orientation="vertical"
         android:background="@color/md_theme_background"
         app:layout_constraintBottom_toBottomOf="parent"
@@ -56,7 +58,7 @@
         <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text = "Apakah anda ingin mengulang pengambilan foto?"
+            android:text = "@string/repeat_question"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             android:textColor="@color/md_theme_onBackground"
@@ -80,7 +82,7 @@
                 android:layout_marginTop="0dp"
                 android:layout_marginEnd="30dp"
                 style="@style/buttonStylePrimary"
-                android:text="Tidak"
+                android:text="@string/tidak"
                 app:layout_constraintStart_toStartOf="parent" />
 
             <Button
@@ -90,9 +92,41 @@
                 android:layout_marginStart="30dp"
                 android:layout_marginTop="0dp"
                 style="@style/buttonStylePrimary"
-                android:text="Ya"
+                android:text="@string/ya"
                 app:layout_constraintEnd_toEndOf="parent" />
         </LinearLayout>
     </LinearLayout>
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_empty_rv_scan"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:layout_constraintTop_toBottomOf="@+id/tv_scan_result_title"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        android:visibility="gone"
+        >
+
+        <ImageView
+            android:id="@+id/iv_no_data"
+            android:layout_width="300dp"
+            android:layout_height="300dp"
+            android:layout_marginTop="20dp"
+            android:contentDescription="@string/cd_transaction_empty"
+            android:src="@drawable/no_data_cuate"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent" />
+
+        <TextView
+            style="@style/TextAppearance.LabelLarge"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:text="@string/msg_empty_transaction"
+            android:textColor="@color/md_theme_tertiary"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/iv_no_data"
+            />
+    </androidx.constraintlayout.widget.ConstraintLayout>
 
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/scan_result_item.xml b/app/src/main/res/layout/scan_result_item.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1c5f15af031e5d79108a8053b422131fa8efac1d
--- /dev/null
+++ b/app/src/main/res/layout/scan_result_item.xml
@@ -0,0 +1,66 @@
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginTop="@dimen/vertical_gap"
+    android:background="@drawable/bg_transaction_card"
+    android:padding="@dimen/card_padding">
+
+    <ImageView
+        android:id="@+id/img_icon_result_transaction"
+        android:layout_width="32dp"
+        android:layout_height="32dp"
+        android:background="@drawable/bg_transaction_icon"
+        android:contentDescription="@string/transaction_category"
+        android:padding="5dp"
+        android:src="@drawable/ic_money_bill_wave"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:tint="@color/md_theme_primary" />
+
+    <TextView
+        android:id="@+id/tv_scan_transaction_item"
+        style="@style/TextAppearance.TitleSmall"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:maxWidth="140dp"
+        android:layout_marginStart="10dp"
+        android:ellipsize="end"
+        android:maxLines="2"
+        android:text="@string/item_name"
+        android:textColor="@color/md_theme_primary"
+        android:textStyle="bold"
+        app:layout_constraintStart_toEndOf="@+id/img_icon_result_transaction"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintVertical_chainStyle="packed" />
+
+    <TextView
+        android:id="@+id/tv_transaction_quantity"
+        style="@style/TextAppearance.LabelMedium"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="10dp"
+        android:ellipsize="end"
+        android:maxLines="1"
+        android:text="@string/number_of_items"
+        android:textColor="@color/md_theme_primary"
+        app:layout_constraintStart_toEndOf="@+id/img_icon_result_transaction"
+        app:layout_constraintTop_toBottomOf="@+id/tv_scan_transaction_item" />
+
+
+    <TextView
+        android:id="@+id/tv_scan_transaction_amount"
+        style="@style/TextAppearance.LabelMedium"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:gravity="start"
+        android:singleLine="true"
+        android:text="@string/transaction_price"
+        android:textColor="@color/md_theme_primary"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.5"
+        app:layout_constraintTop_toTopOf="parent" />
+
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 86878f5f882971fffe3c4626335d13432ceca58a..9b1c2f302d1fc39bd82b597139d0f10d5f83c9cf 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -104,4 +104,11 @@
     <string name="xlsx">xlsx</string>
     <string name="xls">xls</string>
     <string name="cd_btn_twibbon_soobin">Tombol untuk ganti menjadi twibbon Soobin</string>
+    <string name="number_of_items">number of items</string>
+    <string name="item_name">Item name</string>
+    <string name="hasil_scan">Hasil Scan</string>
+    <string name="repeat_question">Apakah anda ingin mengulang pengambilan foto?</string>
+    <string name="tidak">Tidak</string>
+    <string name="ya">Ya</string>
+    <string name="waiting_for_result">Menunggu hasil...</string>
 </resources>
\ No newline at end of file