diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ae44a2c6237eafde985a8baad140a63c0e505281..8a1418fef3c0d1f4a88559e27ff88b9eada4c47d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -10,7 +10,7 @@ android { defaultConfig { applicationId = "com.example.bondoyap" - minSdk = 29 + minSdk = 26 targetSdk = 32 versionCode = 1 versionName = "1.0" diff --git a/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsFragment.kt b/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsFragment.kt index 4aaafacbf0e653f98c065c7d2532fedd702561ff..d7ecda39782ae64f760d850dd2a1e04a84bb24da 100644 --- a/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsFragment.kt +++ b/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsFragment.kt @@ -5,7 +5,12 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.example.bondoyap.R import com.example.bondoyap.databinding.FragmentTransactionsBinding @@ -16,6 +21,10 @@ class TransactionsFragment: Fragment() { // onDestroyView. private val binding get() = _binding!! + private val transactionsViewModel: TransactionsViewModel by viewModels { + TransactionsViewModelFactory((requireContext().applicationContext as TransactionsApplication).repository) + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -23,6 +32,15 @@ class TransactionsFragment: Fragment() { ): View { _binding = FragmentTransactionsBinding.inflate(inflater, container, false) + val recyclerView = binding.root.findViewById<RecyclerView>(R.id.recyclerViewTransactions) + val adapter = TransactionsListAdapter() + recyclerView.adapter = adapter + recyclerView.layoutManager = LinearLayoutManager(requireContext()) + + transactionsViewModel.allTransactions.observe(viewLifecycleOwner, Observer { words -> + words?.let { adapter.submitList(it) } + }) + binding.buttonAddTransaction.setOnClickListener { findNavController().navigate(R.id.navigation_add_transactions) } diff --git a/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsListAdapter.kt b/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsListAdapter.kt new file mode 100644 index 0000000000000000000000000000000000000000..27979437e21a0113368b25e24db0a62cc72d91de --- /dev/null +++ b/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsListAdapter.kt @@ -0,0 +1,58 @@ +package com.example.bondoyap.ui.transactions + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.example.bondoyap.R + +class TransactionsListAdapter : + ListAdapter<Transactions, TransactionsViewHolder>(TransactionsDiffCallback()) { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TransactionsViewHolder { + return TransactionsViewHolder.create(parent) + } + + override fun onBindViewHolder(holder: TransactionsViewHolder, position: Int) { + val currentTransaction = getItem(position) + holder.bind(currentTransaction) + } + +} + +class TransactionsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val transactionTitle: TextView = itemView.findViewById(R.id.transactionTitle) + private val transactionAmount: TextView = itemView.findViewById(R.id.transactionAmount) + private val transactionCategory: TextView = itemView.findViewById(R.id.transactionCategory) + + fun bind(transaction: Transactions) { + val amountText = "IDR " + transaction.nominal.toString() + transactionTitle.text = transaction.judul + transactionAmount.text = amountText + transactionCategory.text = when (transaction.isPemasukan) { + true -> "Pemasukan" + else -> "Pengeluaran" + } + } + + companion object { + fun create(parent: ViewGroup): TransactionsViewHolder { + val view: View = LayoutInflater.from(parent.context) + .inflate(R.layout.recyclerview_transactions, parent, false) + return TransactionsViewHolder(view) + } + } +} + +class TransactionsDiffCallback : DiffUtil.ItemCallback<Transactions>() { + override fun areItemsTheSame(oldItem: Transactions, newItem: Transactions): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame(oldItem: Transactions, newItem: Transactions): Boolean { + return oldItem == newItem + } +} diff --git a/app/src/main/res/layout/fragment_transactions.xml b/app/src/main/res/layout/fragment_transactions.xml index 940a17aa72850d5ef5eeca88569e639e8dc9d3b9..79600287495f8ba4d8189cd7ad96e48e21d423a7 100644 --- a/app/src/main/res/layout/fragment_transactions.xml +++ b/app/src/main/res/layout/fragment_transactions.xml @@ -3,6 +3,12 @@ android:layout_width="match_parent" android:layout_height="match_parent" > + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/recyclerViewTransactions" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginBottom="60dp"/> + <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/button_addTransaction" android:layout_width="wrap_content" diff --git a/app/src/main/res/layout/recyclerview_transactions.xml b/app/src/main/res/layout/recyclerview_transactions.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7809f7cc03bd59809e9f5da9ab116c2fbd201ee --- /dev/null +++ b/app/src/main/res/layout/recyclerview_transactions.xml @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.cardview.widget.CardView 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_margin="8dp" + app:cardCornerRadius="8dp" + app:cardElevation="4dp" + android:clickable="true" + android:focusable="true" + app:cardBackgroundColor="#af5eff"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="16dp"> + + <LinearLayout + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:orientation="vertical"> + + <TextView + android:id="@+id/transactionDate" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textSize="16sp" + android:text="Tanggal" /> + + <TextView + android:id="@+id/transactionTitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textSize="20sp" + android:textStyle="bold" + android:layout_marginTop="5dp" + android:layout_marginBottom="5dp" + android:text="Judul" /> + + <TextView + android:id="@+id/transactionAmount" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textSize="16sp" + android:text="Nominal" /> + + </LinearLayout> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <TextView + android:id="@+id/transactionCategory" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textSize="16sp" + android:text="Kategori" /> + + <TextView + android:id="@+id/transactionLocationn" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textSize="16sp" + android:text="Lokasi" + android:layout_marginTop="36dp"/> + + </LinearLayout> + + </LinearLayout> + +</androidx.cardview.widget.CardView>