Copyright
ii | Copyright
Persembahan
Microservices | iii
Kata Pengantar
Asdasdsa
iv | Kata Pengantar
Daftar Isi
Copyright ....................................................................................... ii
Persembahan ................................................................................ iii
Kata Pengantar.............................................................................. iv
Daftar Isi ........................................................................................ v
Arsitektur Tunggal dan Arsitektur Berbasis Layanan.......................... 1
A. Monolithic Architecture ........................................................ 2
B. Service Oriented Architecture (SOA) .................................... 6
C. Microservices Architecture ................................................... 6
D. Perbandingan Kemampuan Arsitektur ................................. 6
XML (eXtensible Markup Language)................................................. 7
A. Pengertian XML...................................................................... 7
B. Struktur Penulisan Dokumen XML ........................................ 8
C. XML dengan PHP dan MySQL ................................................ 9
a. Membuat File XML................................................................. 9
b. Menambah Data XML ............................................................ 9
D. Parsing Data XML ke Android ................................................ 9
JSON (JavaScript Object Notation) ................................................. 10
A. Pengertian JSON .................................................................. 10
B. Struktur Penulisan JSON ...................................................... 10
C. JSON dengan PHP dan MySQL ............................................ 11
D. Parsing Data JSON ke Android............................................. 11
E. JSON Web Token (JWT) ....................................................... 11
Software Pendukung Developer .................................................... 16
A. Virtualisasi (VMWare, VirtualBox, Docker Container) ....... 16
B. Instalasi Java JDK (Java Development Kit) .......................... 17
C. Instalasi Android Studio & SDK (Software Development
Kit) 28
D. Plugin ADT (Android Development Tools) .......................... 42
E. Instalasi XAMPP ................................................................... 42
F. Instalasi Visual Studio Code................................................. 53
Microservices | v
Pengenalan User Interface (UI) ...................................................... 61
A. Mengenal Layout ................................................................. 62
B. Linear Layout........................................................................ 62
C. Table Layout ......................................................................... 64
D. Relative Layout..................................................................... 67
E. Absolute Layout ................................................................... 68
F. Mengenal View .................................................................... 73
G. Basic View ............................................................................ 73
H. List View ............................................................................... 73
Intent........................................................................................... 74
A. Program Intent Sederhana .................................................. 74
B. Program Intent disertai Menu Pilihan ................................ 74
AsyncTask .................................................................................... 75
A. Bentuk Penulisan subClass AsyncTask ................................ 75
B. Parameter dalam AsyncTask ............................................... 75
C. Metode-Metode dalam AsyncTask ..................................... 75
D. Cara Mengupgrade Versi Android ...................................... 75
Membuat Project Android dengan Monolithic Architecture ............ 76
A. Program Catatan Harian Portable....................................... 77
Membuat Project Android dengan Service Oriented Architecture .. 121
A. Pembuatan Web Service ................................................... 121
B. Operasi CRUD dengan XML ............................................... 121
a. Dari Sisi Server (PHP) ......................................................... 121
b. Dari Sisi Client (Android).................................................... 121
C. Operasi CRUD dengan JSON.............................................. 121
a. Dari Sisi Server (PHP) ......................................................... 121
b. Dari Sisi Client (Android).................................................... 121
Membuat Project Android dengan Microservices Architecture ...... 122
A. Pembuatan Web Service ................................................... 122
vi | Daftar Isi
BAB 1
Arsitektur Tunggal dan
Arsitektur Berbasis Layanan
A. Monolithic Architecture
Monolith berarti semua terdiri dalam satu bagian
(sepaket). Aplikasi dengan arsitektur monolithic
menggambarkan perangkat lunak terdiri pada satu
tingkat dimana komponen-komponen yang berbeda
digabungkan menjadi satu program utuh pada satu
platform tunggal.
Manfaat:
Mudah dikembangkan. Ketika awal
pembuatan suatu proyek, jauh lebih mudah
digunakan dengan Arsitektur Monolitik.
Mudah diuji. Kita dapat melakukan pengujian
hanya dengan satu tools seperti Selenium
(https://www.seleniumhq.org), atau Selenium
IDE langsung pada browser Chrome
Kekurangan:
Sulitnya pemeliharaan (maintenance). Jika
Aplikasi terlalu besar dan kompleks untuk
dipahami sepenuhnya, sehingga sulit untuk
melakukan perubahan dengan cepat dan
benar.
Ukuran aplikasi dapat memperlambat waktu
start-up karena semua dalam satu paket
(bundling).
Harus melakukan deployment ulang secara
keseluruhan setiap ada pembaruan atau ada
perbaikan (patching).
Keandalan. Bug dalam modul apa pun
misalnya kebocoran memori berpotensi dapat
menurunkan seluruh proses. Terlebih lagi,
karena semua instance aplikasi identik, bug
itu memengaruhi ketersediaan seluruh
aplikasi
Sulit untuk mengadopsi teknologi baru dan
maju. Karena perubahan dalam bahasa atau
kerangka kerja mempengaruhi seluruh
aplikasi.
C. Microservices Architecture
D. Perbandingan Kemampuan
Arsitektur
A. Pengertian XML
Menurut W3Schools XML merupakan singkatan dari
eXtensible Markup Language, merupakan Bahasa
markup seperti HTML yang dirancang untuk
menyimpan dan mengantarkan data dan bersifat
deskriptif sendiri (independent dan mendefinisikan
TAG sendiri) (W3School, n.d.-a).
A. Pengertian JSON
Java Script Object Notation atau biasa disebut JSON
merupakan format pertukaran data yang bersifat
independent (stateless) yang tidak bergantung pada
Bahasa pemrograman manapun. JSON
menggunakan sintaksis JavaScript, tetapi format
JSON hanya teks. Teks dapat dibaca dan digunakan
sebagai format data oleh bahasa pemrograman apa
pun (W3School, n.d.-b).
{
"first_name" : "Yasmin", "last_name" :
"Almaira",
"location" : "Tasikmalaya",
"online" : true,
"followers" : 9876
}
xxxxxx.yyyyyyy.zzzzzzzzz
header.payload.signature
Gambar 4. Struktur JSON Web Token.
{
“alg” : “HS256”,
“typ” : “JWT”,
}
{
“sub”: ”123456789”,
“name”: “Raffan Mauza”,
“admin”: true
}
Gambar 6. JWT Payload.
HMACSHA256(
base64UrlEncode(header)+”.”+
base64UrlEncode(payload),
secret)
Gambar 7. JWT Signature.
VirtualBox
Docker Container
asdasdasd
1
3 2
java --version
E. Instalasi XAMPP
Teruntuk kamu yang ingin ingin membuat Website
namun belum memiliki domain dan hosting kamu
bisa menggunakan XAMPP sebagai alternative
sehingga kamu dapat membuat komputer kamu
seolah-olah sebagai server hosting pribadi kamu.
Berikut cara instalasi XAMPP :
A. Mengenal Layout
Layout adalah tata letak elemen desain terhadap
suatu bidang dalam media tertentu untuk
mendukung konsep/pesan yang dibawanya (Sutria,
2013). Karena pada kesempatan kita kali ini akan
lebih banyak menggunakan android studio, maka
dapat diartikan dalam arti yang lebih sempit Layout
pada android studio merupakan sebuah tataletak
yang mengatur penempatan gambar, teks ataupun
komponen lain sehingga terlihat rapih dan nyaman
ketika digunakan oleh pengguna.
Layout pada Android Studio memiliki banyak
jenis yang dapat kamu gunakan sesuai kebutuhan
aplikasi, diantaranya adalah Linear Layout, Table
Layout, Relative Layout dan Absolute Layout.
B. Linear Layout
Linear layout adalah layout yang menjajarkan
komponen-komponen yang ada didalamnya secara
horizontal ataupun vertikal dengan menggunakan
atribut android:orientation.
Semua komponen yang berada didalam
Linearlayout akan ditumpuk menjadi satu, jadi pada
Linearlayout berorientasi vertikal hanya akan
memiliki satu baris kekanan berapapun banyaknya
begitupula dengan Linearlayout yang berorientasi
horizontal hanya akan memiliki satu baris kebawah
sampai penutup Linearlayout itu sendiri.
xmlns:app="http://schemas.android.com/apk/res-
auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp"
android:background="#8BC34A"
android:layout_marginBottom="16dp"
android:layout_marginTop="16dp"
>
<EditText
android:layout_width="250dp"
android:layout_height="match_parent"
android:hint="Cari Apa?"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cari"
android:layout_weight="1"
android:layout_gravity="right"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp"
android:background="#FFF59D"
android:layout_marginBottom="16dp"
android:layout_marginTop="16dp"
>
</LinearLayout>
</LinearLayout>
Penjelasan :
1. Linearlayout berwarna biru merupakan
contoh penggunaan orintasi horizontal,
dimana setiap komponen akan terus mengisi
ruas secara horizontal.
2. Linearlayout berwarna merah merupakan
contoh penggunaan orientasi vertikal, dimana
setiap kompnen akan terus mengisi ruas
secara vertikal.
C. Table Layout
Seperti namanya Table Layout, dalam layout ini
dibangun dengan adanya Baris dan kolom. Pada
dasarnya Table layout mirip seperti Linear ayout,
dimana Baris pada tabel layout merupakan
linearlayout berorientasi horizontal dan kolom pada
<TableLayout
xmlns:android="http://schemas.android.com/apk/re
s/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TableRow
android:paddingTop="25dp"
android:gravity="center"
android:layout_marginTop="20px">
<TextView
android:layout_width="wrap_content"
android:layout_gravity="center"
android:text="Selamat Datang..."
android:textColor="#388E3C"
android:textSize="25sp"
android:textStyle="bold" />
</TableRow>
<TableRow
android:layout_marginTop="20dip" >
<TextView
android:layout_width="wrap_content"
android:text="Email :"
android:textSize="18sp"
android:textColor="#000000"
android:layout_marginLeft="20dp"
></TextView>
<EditText
android:layout_height="wrap_content"
</EditText>
</TableRow>
<TableRow
android:layout_marginTop="20dip" >
<TextView
android:layout_width="wrap_content"
android:text="Password :"
android:textSize="18sp"
android:textColor="#000000"
android:layout_marginLeft="20dp"
></TextView>
<EditText
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:layout_weight="1" >
</EditText>
</TableRow>
<TableRow
android:gravity="center"
android:layout_marginTop="20dip" >
<Button
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_weight="1"
android:background="#388E3C"
android:textColor="#FFF59D"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:text="LOGIN"/>
</TableRow>
</TableLayout>
xmlns:app="http://schemas.android.com/apk/res-
auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:padding="10dp">
<EditText
android:id="@+id/email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Email"/>
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Password"
android:layout_below="@id/email"/>
android:layout_toLeftOf="@id/namabelakang"
android:hint="Nama Depan"/>
<EditText
android:id="@+id/namabelakang"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_below="@id/password"
android:layout_alignParentRight="true"
android:hint="Nama Belakang"/>
<Button
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_below="@id/namabelakang"
android:layout_alignParentRight="true"
android:background="#388E3C"
android:textColor="#FFF59D"
android:text="Buat Akun" />
</RelativeLayout>
E. Constraint Layout
Pada dasarnya Constraintlayout itu hamper mirip
dengan Relativelayout karena tataletak komponen
disesuaikan dengan komponen lainnya, seperti
contohnya pada relativelayout dapat meletakan
setiap komponen diatas/bawah ataupun disamping
kompnen lainnya. Akan tetapi jika kamu terbiasa
dengan editor drag&drop ConstrainLayout bisa jadi
pilihan tepat untuk kamu karena Constrainlayout
lebih fleksibel dan mudah digunakan pada Layout
Editor.
xmlns:app="http://schemas.android.com/apk/res-
auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
<EditText
android:id="@+id/email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Email"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/email"
android:hint="Password"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/email"
/>
<EditText
android:id="@+id/namadepan"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_below="@id/password"
android:layout_alignParentLeft="true"
android:hint="Nama Depan"
app:layout_constraintEnd_toStartOf="@+id/namabel
akang"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/passwo
rd" />
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/passwo
rd" />
<Button
android:id="@+id/button"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_below="@id/namabelakang"
android:layout_alignParentRight="true"
android:layout_marginTop="84dp"
android:background="#388E3C"
android:text="Buat Akun"
android:textColor="#FFF59D"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/namabe
lakang" />
</androidx.constraintlayout.widget.ConstraintLay
out>
F. Absolute Layout
Berbeda dengan Layout lainnya dimana mereka
memiliki orientasi terstruktur dan terkait dengan
komponen lainnya, Absolutelayout hadir ketika
kamu ingin menentukan secara tepat (koordinat
X/Y) sebuah komponen yang akan kamu gunakan
dalam sebuah aplikasi.
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:padding="10dp">
<Button
android:id="@+id/button"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_marginTop="84dp"
android:layout_x="125dp"
android:layout_y="315dp"
android:background="#388E3C"
android:text="Button"
android:textColor="#FFF59D" />
</AbsoluteLayout>
H. Basic View
I. List View
Asd
74 | Intent
BAB 7
AsyncTask
Asd
AsyncTask | 75
BAB 8
Membuat Project Android
dengan Monolithic
Architecture
package com.example.catang.model;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
import java.io.Serializable;
@Entity(tableName = "tbHutang")
public class Hutang implements Serializable {
@PrimaryKey(autoGenerate = true)
private int hutangId;
@ColumnInfo(name = "nama")
private String nama;
@ColumnInfo(name = "jumlah")
private String jumlah;
@ColumnInfo(name = "keterangan")
private String keterangan;
@ColumnInfo(name = "status")
private int status;
@ColumnInfo(name = "type")
private int type;
package com.example.catang.data;
import androidx.room.Dao;
package com.example.catang.data;
import androidx.room.Database;
import androidx.room.RoomDatabase;
import com.example.catang.model.Hutang;
package com.example.catang.data;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import com.example.catang.model.Hutang;
@Dao
public interface HutangDAO {
xmlns:app="http://schemas.android.com/apk/res-
auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
<RadioGroup
android:id="@+id/jenis_hutang"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
android:layout_marginTop="6dp"
android:orientation="horizontal">
<RadioButton
android:id="@+id/memberiHutang"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="Memberi Hutang" />
<RadioButton
android:id="@+id/menerimaHutang"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:text="Menerima Hutang" />
</RadioGroup>
<com.google.android.material.textfield.TextInput
Layout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
style="@style/Widget.MaterialComponents.TextInpu
tLayout.OutlinedBox">
<com.google.android.material.textfield.TextInput
EditText
android:id="@+id/nama"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="NAMA" />
<com.google.android.material.textfield.TextInput
Layout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
style="@style/Widget.MaterialComponents.TextInpu
tLayout.OutlinedBox">
<com.google.android.material.textfield.TextInput
EditText
android:id="@+id/jumlah"
android:inputType="number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Jumlah Pinjaman" />
</com.google.android.material.textfield.TextInpu
tLayout>
<com.google.android.material.textfield.TextInput
Layout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
style="@style/Widget.MaterialComponents.TextInpu
tLayout.OutlinedBox">
<com.google.android.material.textfield.TextInput
EditText
android:id="@+id/keterangan"
android:lines="5"
android:maxLines="5"
android:gravity="top|left"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Keterangan" />
<Button
android:id="@+id/btnSave"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Simpan"
android:background="@color/colorPrimary"
android:textColor="#FFFFFF"/>
</LinearLayout>
import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Room;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
import com.example.catang.data.AppDatabase;
import com.example.catang.model.Hutang;
import
com.google.android.material.textfield.TextInputE
ditText;
setContentView(R.layout.activity_tambah_hutang);
getSupportActionBar().setTitle("Tambah
Hutang");
nama = findViewById(R.id.nama);
jumlah = findViewById(R.id.jumlah);
keterangan =
findViewById(R.id.keterangan);
radioGroup =
findViewById(R.id.jenis_hutang);
menerimaHutang =
findViewById(R.id.menerimaHutang);
memberiHutang =
findViewById(R.id.memberiHutang);
btnSave = findViewById(R.id.btnSave);
appDatabase = Room.databaseBuilder(
getApplicationContext(),
AppDatabase.class,
"dbHutang").build();
btnSave.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
if (menerimaHutang.isChecked()){
typeHutang = 1;
} else if
(memberiHutang.isChecked()){
typeHutang = 2;
}
if
(nama.getText().toString().isEmpty() ||
jumlah.getText().toString().isEmpty() ||
keterangan.getText().toString().isEmpty()){
Toast.makeText(TambahHutang.this, "Berhasil
Tambah Data ", Toast.LENGTH_SHORT).show();
hutang.setNama(nama.getText().toString());
hutang.setJumlah(jumlah.getText().toString());
hutang.setKeterangan(keterangan.getText().toStri
ng());
hutang.setStatus(1);
hutang.setType(typeHutang);
insertHutang(hutang);
}
}
});
@SuppressLint("StaticFieldLeak")
private void insertHutang(final Hutang
hutang){
new AsyncTask<Void, Void, Long>(){
@Override
protected Long
doInBackground(Void... voids) {
return
appDatabase.hutangDAO().insertHutang(hutang);
}
@Override
protected void onPostExecute(Long
status) {
xmlns:app="http://schemas.android.com/apk/res-
auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.material.floatingactionbutto
n.FloatingActionButton
android:id="@+id/fabTambah"
android:backgroundTint="@color/colorPrimary"
app:borderWidth="0dp"
app:elevation="6dp"
app:fabSize="normal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:src="@drawable/ic_add"
/>
</androidx.constraintlayout.widget.ConstraintLay
out>
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import com.example.catang.R;
import
com.google.android.material.floatingactionbutton
.FloatingActionButton;
FloatingActionButton fabTambah;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fabTambah =
findViewById(R.id.fabTambah);
fabTambah.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new
Intent(MainActivity.this, TambahHutang.class));
}
});
}
}
package com.example.catang.data;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import com.example.catang.model.Hutang;
@Dao
public interface HutangDAO {
@Insert(onConflict =
OnConflictStrategy.REPLACE)
long insertHutang(Hutang hutang);
xmlns:app="http://schemas.android.com/apk/res-
auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.floatingactionbutto
n.FloatingActionButton
android:id="@+id/fabTambah"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="15dp"
android:backgroundTint="@color/colorPrimary"
app:borderWidth="0dp"
app:elevation="6dp"
app:fabSize="normal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:src="@drawable/ic_add"
/>
</androidx.constraintlayout.widget.ConstraintLay
out>
xmlns:app="http://schemas.android.com/apk/res-
auto"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp"
app:cardCornerRadius="2dp"
app:cardElevation="1dp"
android:clickable="true"
android:focusable="true"
android:foreground="?attr/selectableItemBackgrou
nd"
app:cardBackgroundColor="@color/colorAccent"
android:id="@+id/card_item">
<LinearLayout
android:id="@+id/line"
android:layout_width="10dp"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#49000000"></LinearLayout>
<RelativeLayout
android:padding="10dp"
android:layout_marginStart="10dp"
android:layout_marginLeft="10dp"
android:layout_width="match_parent"
android:layout_height="70dp">
<TextView
android:id="@+id/nama"
android:text="Nama"
android:layout_width="match_parent"
android:textSize="18sp"
android:textColor="@android:color/white"
android:layout_height="wrap_content"
/>
<TextView
android:textColor="@android:color/white"
android:layout_marginTop="5dp"/>
<androidx.constraintlayout.widget.ConstraintLayo
ut
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/imgStatus"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:src="@drawable/ic_done"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLay
out>
</RelativeLayout>
</androidx.cardview.widget.CardView>
package com.example.catatanhutang;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.cardview.widget.CardView;
import
androidx.recyclerview.widget.RecyclerView;
import androidx.room.Room;
import com.example.catang.R;
import com.example.catang.data.AppDatabase;
import com.example.catang.model.Hutang;
import java.util.ArrayList;
public HutangAdapter(ArrayList<Hutang>
daftarHutang, Context context){
this.daftarHutang = daftarHutang;
this.context = context;
appDatabase = Room.databaseBuilder(
context.getApplicationContext(),
AppDatabase.class,
"dbHutang").allowMainThreadQueries().build();
ViewHolder(View itemView){
super(itemView);
etNama =
itemView.findViewById(R.id.nama);
etJumlah =
itemView.findViewById(R.id.jumlah);
card_item =
itemView.findViewById(R.id.card_item);
imgStatus =
itemView.findViewById(R.id.imgStatus);
}
}
@NonNull
@Override
public ViewHolder
onCreateViewHolder(@NonNull ViewGroup parent,
int viewType) {
//Inisialisasi Layout Item untuk
RecyclerView
View v =
LayoutInflater.from(parent.getContext()).inflate
(R.layout.item_hutang, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull
ViewHolder holder, final int position) {
holder.card_item.setCardBackgroundColor(Color.pa
rseColor("#D81B60"));
} else if (getType == 2){
holder.card_item.setCardBackgroundColor(Color.pa
rseColor("#008577"));
}
if (getStatus == 1 ){
holder.imgStatus.setVisibility(View.INVISIBLE);
} else if (getStatus == 2 ){
holder.imgStatus.setVisibility(View.VISIBLE);
}
@Override
public int getItemCount() {
//Menghitung data / ukuran dari Array
return daftarHutang.size();
}
package com.example.catang;
import
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import com.example.catang.R;
import
com.example.catang.data.AppDatabase;
import com.example.catang.model.Hutang;
import
com.google.android.material.floatingactionbutton
.FloatingActionButton;
import java.util.ArrayList;
import java.util.Arrays;
FloatingActionButton fabTambah;
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager
layoutManager;
private AppDatabase appDatabase;
private ArrayList<Hutang> daftarHutang;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
appDatabase =
Room.databaseBuilder(getApplicationContext(),App
Database.class,"dbHutang").allowMainThreadQuerie
s().build();
recyclerView =
findViewById(R.id.dataItem);
recyclerView.setHasFixedSize(true);
layoutManager = new
LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
adapter = new
com.example.catatanhutang.HutangAdapter(daftarHu
tang, MainActivity.this);
recyclerView.setAdapter(adapter);
fabTambah =
findViewById(R.id.fabTambah);
fabTambah.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new
Intent(MainActivity.this, TambahHutang.class));
}
});
}
}
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Update;
import com.example.catang.model.Hutang;
@Dao
public interface HutangDAO {
@Insert(onConflict =
OnConflictStrategy.REPLACE)
long insertHutang(Hutang hutang);
@Update
int updateHutang(Hutang hutang);
xmlns:app="http://schemas.android.com/apk/res-
auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_margin="6dp"
tools:context=".LunasHutang">
<com.google.android.material.textfield.TextInput
Layout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
<com.google.android.material.textfield.TextInput
EditText
android:id="@+id/nama"
android:enabled="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="NAMA" />
</com.google.android.material.textfield.TextInpu
tLayout>
<com.google.android.material.textfield.TextInput
Layout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
style="@style/Widget.MaterialComponents.TextInpu
tLayout.OutlinedBox">
<com.google.android.material.textfield.TextInput
EditText
android:id="@+id/jumlah"
android:inputType="number"
android:enabled="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Jumlah Pinjaman" />
</com.google.android.material.textfield.TextInpu
tLayout>
<com.google.android.material.textfield.TextInput
Layout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
<com.google.android.material.textfield.TextInput
EditText
android:id="@+id/keterangan"
android:lines="5"
android:maxLines="5"
android:enabled="false"
android:gravity="top|left"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Keterangan" />
</com.google.android.material.textfield.TextInpu
tLayout>
<Button
android:id="@+id/btnLunas"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Lunas"
android:background="@color/colorPrimary"
android:textColor="#FFFFFF"/>
</LinearLayout>
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import com.example.catang.R;
import com.example.catang.TambahHutang;
import com.example.catang.data.AppDatabase;
import com.example.catang.model.Hutang;
import java.util.ArrayList;
public HutangAdapter(ArrayList<Hutang>
daftarHutang, Context context){
this.daftarHutang = daftarHutang;
this.context = context;
appDatabase = Room.databaseBuilder(
context.getApplicationContext(),
AppDatabase.class,
"dbHutang").allowMainThreadQueries().build();
ViewHolder(View itemView){
super(itemView);
etNama =
itemView.findViewById(R.id.nama);
etJumlah =
itemView.findViewById(R.id.jumlah);
card_item =
}
}
@NonNull
@Override
public ViewHolder
onCreateViewHolder(@NonNull ViewGroup parent,
int viewType) {
//Inisialisasi Layout Item untuk
RecyclerView
View v =
LayoutInflater.from(parent.getContext()).inflate
(R.layout.item_hutang, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull
ViewHolder holder, final int position) {
holder.card_item.setCardBackgroundColor(Color.pa
rseColor("#D81B60"));
} else if (getType == 2){
if (getStatus == 1 ){
holder.imgStatus.setVisibility(View.INVISIBLE);
} else if (getStatus == 2 ){
holder.imgStatus.setVisibility(View.VISIBLE);
}
holder.itemView.setOnLongClickListener(new
View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
CharSequence[] menuPilihan =
{"Edit", "Delete"};
AlertDialog.Builder dialog = new
AlertDialog.Builder(v.getContext())
.setTitle("Pilih Aksi")
.setItems(menuPilihan,
new DialogInterface.OnClickListener() {
@Override
public void
onClick(DialogInterface dialog, int which) {
switch (which){
case 0:
/*
Menjalankan
Perintah Edit Data
Menggunakan
Bundle untuk mengambil data yang akan Diedit
*/
onEditData(position, context);
break;
case 1:
/*
Menjalankan
Perintah Delete Data
Akan
onDeleteData(position);
break;
}
}
});
dialog.create();
dialog.show();
return true;
}
});
@Override
public int getItemCount() {
//Menghitung data / ukuran dari Array
return daftarHutang.size();
}
import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Room;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.example.catang.data.AppDatabase;
import com.example.catang.model.Hutang;
import
com.google.android.material.textfield.TextInputE
ditText;
setContentView(R.layout.activity_lunas_hutang);
nama = findViewById(R.id.nama);
jumlah = findViewById(R.id.jumlah);
keterangan =
findViewById(R.id.keterangan);
btnLunas = findViewById(R.id.btnLunas);
appDatabase =
Room.databaseBuilder(getApplicationContext(),App
Database.class,"dbHutang").allowMainThreadQuerie
s().build();
getDataHutang();
hutang =
(Hutang)getIntent().getSerializableExtra("data")
;
nama.setText(hutang.getNama());
jumlah.setText(hutang.getJumlah());
keterangan.setText(hutang.getKeterangan());
if (hutang.getType() == 1){
getSupportActionBar().setTitle("Menerima
Hutang");
} else if (hutang.getType() == 2){
getSupportActionBar().setTitle("Memberi
Hutang");
}
@SuppressLint("StaticFieldLeak")
private void updateDataHutang(final Hutang
hutang){
new AsyncTask<Void, Void, Integer>(){
@Override
protected Integer
doInBackground(Void... voids) {
//Menjalankan proses insert data
return
}.execute();
}
@Override
public void onBackPressed() {
super.onBackPressed();
startActivity(new
Intent(LunasHutang.this, MainActivity.class));
finish();
}
}
package com.example.catang.data;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import com.example.catang.model.Hutang;
@Dao
public interface HutangDAO {
@Insert(onConflict =
OnConflictStrategy.REPLACE)
long insertHutang(Hutang hutang);
@Update
int updateHutang(Hutang hutang);
@Delete
void deleteHutang(Hutang hutang);
appDatabase.hutangDAO().deleteHutang(daftarHutan
g.get(position));
daftarHutang.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position,
daftarHutang.size());
Toast.makeText(context, "Data Berhasil
Dihapus", Toast.LENGTH_SHORT).show();
}
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Update;
import com.example.catang.model.Hutang;
@Dao
public interface HutangDAO {
@Insert(onConflict =
OnConflictStrategy.REPLACE)
long insertHutang(Hutang hutang);
@Update
int updateHutang(Hutang hutang);
@Delete
void deleteHutang(Hutang hutang);
xmlns:app="http://schemas.android.com/apk/res-
auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_margin="6dp"
tools:context=".DetailHutang">
<com.google.android.material.textfield.TextInput
Layout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
style="@style/Widget.MaterialComponents.TextInpu
<com.google.android.material.textfield.TextInput
EditText
android:id="@+id/nama"
android:enabled="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="NAMA" />
</com.google.android.material.textfield.TextInpu
tLayout>
<com.google.android.material.textfield.TextInput
Layout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
style="@style/Widget.MaterialComponents.TextInpu
tLayout.OutlinedBox">
<com.google.android.material.textfield.TextInput
EditText
android:id="@+id/jumlah"
android:inputType="number"
android:enabled="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Jumlah Pinjaman" />
</com.google.android.material.textfield.TextInpu
tLayout>
<com.google.android.material.textfield.TextInput
Layout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
style="@style/Widget.MaterialComponents.TextInpu
tLayout.OutlinedBox">
</com.google.android.material.textfield.TextInpu
tLayout>
<com.google.android.material.textfield.TextInput
Layout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
style="@style/Widget.MaterialComponents.TextInpu
tLayout.OutlinedBox">
<com.google.android.material.textfield.TextInput
EditText
android:id="@+id/status"
android:enabled="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Status" />
</com.google.android.material.textfield.TextInpu
tLayout>
</LinearLayout>
package com.example.catang;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.example.catang.model.Hutang;
import
com.google.android.material.textfield.TextInputE
ditText;
setContentView(R.layout.activity_detail_hutang);
nama = findViewById(R.id.nama);
jumlah = findViewById(R.id.jumlah);
keterangan =
findViewById(R.id.keterangan);
status = findViewById(R.id.status);
getDetailData();
}
keterangan.setText(hutang.getKeterangan());
if (hutang.getStatus() == 1){
status.setText("Belum Lunas");
} else if (hutang.getStatus() == 2){
status.setText("Lunas");
}
}
}
}
G. Cek ricek