Mengelola daftar tugas harian adalah bagian tak terpisahkan dari kehidupan kita, baik itu untuk pekerjaan, belajar, atau sekadar urusan pribadi. Aplikasi To Do List adalah salah satu alat paling mendasar namun sangat berguna yang banyak dicari orang. Bagi Anda yang baru memulai petualangan di dunia pengembangan Android, membangun aplikasi To Do List sederhana menggunakan Kotlin adalah proyek awal yang sangat ideal.
Proyek ini bukan hanya akan membantu Anda memahami dasar-dasar pengembangan Android dan Kotlin, tetapi juga memperkenalkan konsep penting seperti tampilan UI (User Interface) dengan RecyclerView, manajemen status aplikasi, hingga persistensi data dasar. Melalui panduan ini, kita akan membangun aplikasi To Do List yang fungsional dari nol, meliputi penambahan tugas, penandaan tugas selesai, hingga penghapusan tugas.
Jadi, siapkan Android Studio Anda, mari kita selami langkah demi langkah membangun aplikasi To Do List pertama Anda dengan Kotlin!
Prasyarat Sebelum Memulai
Sebelum kita terjun ke kode, ada beberapa hal yang perlu Anda siapkan:
- Android Studio: Pastikan Anda sudah menginstal Android Studio versi terbaru di komputer Anda.
- Dasar-dasar Kotlin: Pemahaman dasar tentang sintaksis Kotlin (variabel, fungsi, kelas, objek) akan sangat membantu.
- Konsep Dasar Android: Familiaritas dengan Activity, Layout XML, dan View akan mempercepat proses belajar.
Langkah 1: Membuat Proyek Android Baru
Pertama, kita akan membuat proyek baru di Android Studio.
- Buka Android Studio.
- Pilih “New Project”.
- Pilih template “Empty Activity” dan klik “Next”.
- Konfigurasi proyek Anda:
- Name:
MyTodoListApp(atau nama lain sesuai keinginan Anda) - Package name: Biarkan default atau sesuaikan.
- Save location: Pilih lokasi penyimpanan proyek Anda.
- Language: Pilih
Kotlin. - Minimum SDK: Anda bisa memilih API 21 atau yang lebih baru. Semakin tinggi API, semakin sedikit perangkat yang didukung, tapi Anda bisa menggunakan fitur terbaru. Untuk tutorial ini, API 21 sudah cukup.
- Name:
- Klik “Finish” dan tunggu Android Studio menyelesaikan setup proyek Anda.
Setelah proyek terbuka, Anda akan melihat struktur folder standar Android, termasuk MainActivity.kt dan activity_main.xml.
Langkah 2: Mendesain Tampilan UI (activity_main.xml)
Kita akan mendesain UI aplikasi kita agar pengguna bisa menambahkan dan melihat daftar tugas. Buka file app/src/main/res/layout/activity_main.xml.
Kita akan menggunakan beberapa komponen utama:
EditText: Untuk input tugas baru.Button: Untuk menambahkan tugas.RecyclerView: Untuk menampilkan daftar tugas secara efisien.
Kita akan menyusun komponen ini dalam sebuah LinearLayout atau ConstraintLayout. Untuk kesederhanaan, mari gunakan LinearLayout dengan orientasi vertikal. Kita tempatkan EditText dan Button di bagian atas, kemudian RecyclerView di bawahnya.
Berikut adalah deskripsi struktur XML yang akan kita gunakan:
Tag pembuka untuk LinearLayout akan menjadi elemen root, dengan atribut android:orientation="vertical" dan android:padding="16dp". Di dalamnya, kita akan memiliki sebuah LinearLayout lagi untuk menampung EditText dan Button secara horizontal.
Untuk EditText, kita akan memberinya android:id="@+id/etTodoTitle", android:layout_width="0dp", android:layout_weight="1" agar memenuhi sisa ruang, dan android:hint="Masukkan tugas baru".
Untuk Button, kita akan memberinya android:id="@+id/btnAddTodo", android:layout_width="wrap_content", android:text="Tambah".
Di bawah LinearLayout horizontal tersebut, kita akan menempatkan RecyclerView dengan android:id="@+id/rvTodoItems", android:layout_width="match_parent", dan android:layout_height="match_parent".
Pastikan Anda menambahkan ID yang unik untuk setiap elemen agar mudah diakses dari kode Kotlin.
Langkah 3: Membuat Item Layout untuk RecyclerView (item_todo.xml)
Setiap item dalam RecyclerView membutuhkan layout-nya sendiri. Buat file XML baru di folder res/layout/ dengan nama item_todo.xml.
Layout ini akan merepresentasikan satu item tugas, yang terdiri dari:
CheckBox: Untuk menandai tugas sudah selesai atau belum.TextView: Untuk menampilkan judul tugas.
Kita bisa menggunakan LinearLayout horizontal sebagai root untuk item_todo.xml. Di dalamnya, kita akan menambahkan sebuah CheckBox dengan ID @+id/cbDone dan TextView dengan ID @+id/tvTodoTitle. TextView ini akan memiliki atribut android:layout_weight="1" agar mengisi sisa ruang setelah CheckBox.
Langkah 4: Membuat Data Model (Todo.kt)
Setiap tugas (To Do item) akan direpresentasikan oleh sebuah objek. Kita perlu membuat kelas data untuk ini. Buat file Kotlin baru di folder package aplikasi Anda dengan nama Todo.kt.
Kelas data ini akan sederhana, hanya memiliki dua properti:
title:Stringuntuk judul tugas.isChecked:Booleanuntuk menandai apakah tugas sudah selesai.
Kita bisa mendefinisikannya sebagai data class Todo(val title: String, var isChecked: Boolean = false). Penggunaan data class di Kotlin sangat praktis karena secara otomatis menyediakan fungsi seperti equals(), hashCode(), toString(), dan copy().
Langkah 5: Membuat Adapter untuk RecyclerView (TodoAdapter.kt)
RecyclerView memerlukan sebuah adapter untuk menjembatani data dengan tampilannya. Adapter bertanggung jawab untuk membuat dan mengikat (bind) data ke setiap item tampilan. Buat file Kotlin baru dengan nama TodoAdapter.kt.
Kelas TodoAdapter akan mewarisi dari RecyclerView.Adapter. Ini akan memiliki sebuah konstruktor yang menerima daftar tugas (List) dan sebuah lambda atau fungsi callback untuk menangani interaksi seperti perubahan status CheckBox.
Di dalam kelas ini, Anda akan memiliki:
TodoViewHolder(kelas dalam): Ini adalah kelasViewHolderyang menampung referensi ke tampilan-tampilan dalamitem_todo.xml(CheckBoxdanTextView).onCreateViewHolder(): Metode ini dipanggil ketikaRecyclerViewperlu membuatViewHolderbaru. Di sini, kita akan meng-inflate layoutitem_todo.xmldan mengembalikannya dalamTodoViewHolder.onBindViewHolder(): Metode ini dipanggil untuk menampilkan data pada posisi tertentu. Kita akan mengambil objekTododari daftar berdasarkan posisi dan mengikatnya ke tampilan diTodoViewHolder. Kita juga akan mengaturOnClickListeneruntukCheckBoxagar statusisCheckedbisa diubah dan memanggil callback keMainActivity.getItemCount(): Mengembalikan jumlah total item dalam daftar tugas.
Tambahkan juga fungsi-fungsi bantuan di TodoAdapter untuk memanipulasi daftar tugas, seperti addTodo(todo: Todo), toggleTodo(pos: Int), dan deleteCheckedTodos(). Setelah perubahan pada daftar, jangan lupa memanggil notifyDataSetChanged() atau metode notifyItem...() yang lebih spesifik agar RecyclerView memperbarui tampilannya.
Langkah 6: Implementasi Logika Utama (MainActivity.kt)
Sekarang, kita akan menghubungkan semua komponen di MainActivity.kt. Buka file app/src/main/java/com.example.mytodolistapp/MainActivity.kt.
Di dalam kelas MainActivity:
- Deklarasi Variabel:
lateinit var todoAdapter: TodoAdapterprivate val todos = mutableListOf()
- Inisialisasi di
onCreate():- Inisialisasi
todoAdapterdengan daftartodosdan callback untuk perubahan status. - Setup
RecyclerViewdenganLinearLayoutManagerdan settodoAdapter. - Tangani event klik pada
btnAddTodo. Ketika tombol diklik, ambil teks darietTodoTitle, buat objekTodobaru, tambahkan ke daftartodos, perbarui adapter, dan kosongkanetTodoTitle. - Anda juga bisa menambahkan tombol atau mekanisme untuk menghapus tugas yang sudah selesai. Misalnya, sebuah tombol “Hapus Selesai” di bagian bawah layar atau di toolbar.
- Inisialisasi
- Fungsi Aksi:
addTodo(todo: Todo): Menambahkan tugas ke daftar dan memberi tahu adapter.toggleTodo(position: Int): Mengubah statusisCheckeddari tugas pada posisi tertentu dan memberi tahu adapter.deleteCheckedTodos(): Menghapus semua tugas yang memilikiisChecked = truedari daftar dan memberi tahu adapter.
Pastikan Anda mengimpor semua kelas yang diperlukan seperti androidx.recyclerview.widget.RecyclerView, android.widget.LinearLayoutManager, dll.
Aplikasi To Do List tidak akan berguna jika datanya hilang setiap kali aplikasi ditutup. Kita akan menggunakan SharedPreferences untuk menyimpan data daftar tugas. Ini adalah cara sederhana untuk menyimpan data kecil, seperti pengaturan aplikasi atau daftar tugas ini.
Untuk menyimpan daftar objek, kita tidak bisa langsung menyimpannya di SharedPreferences. Solusi umumnya adalah mengonversi daftar objek menjadi string JSON, lalu menyimpannya. Untuk ini, kita akan menggunakan library Gson.
Menambahkan Dependensi Gson:
Buka file app/build.gradle (Module: app) dan tambahkan dependensi Gson di blok dependencies:
implementation 'com.google.code.gson:gson:2.10.1'
Sinkronkan proyek Anda setelah menambahkan dependensi.
Logika di MainActivity.kt:
Buat dua fungsi di MainActivity.kt:
saveTodos():Fungsi ini akan mengambil daftar
todossaat ini, mengonversinya menjadi string JSON menggunakan Gson, lalu menyimpannya keSharedPreferences. Anda bisa mendapatkan instanceSharedPreferencesdengangetSharedPreferences("todo_prefs", MODE_PRIVATE).Panggil fungsi ini setiap kali daftar tugas berubah (setelah
addTodo,toggleTodo,deleteCheckedTodos).loadTodos():Fungsi ini akan mengambil string JSON dari
SharedPreferences, mengonversinya kembali menjadiListmenggunakan Gson. Panggil fungsi ini di dalamonCreate()sebelum menginisialisasi adapter untuk memuat data lama.Pastikan untuk menangani kasus di mana tidak ada data tersimpan (string kosong atau null).
Dengan SharedPreferences dan Gson, data daftar tugas Anda kini akan persisten meskipun aplikasi ditutup dan dibuka kembali.
Masalah yang Sering Terjadi
Saat mengembangkan aplikasi To Do List ini, beberapa masalah umum mungkin Anda hadapi:
-
RecyclerView Tidak Menampilkan Data
Gejala: Aplikasi berjalan tanpa error, tetapi
RecyclerViewkosong.Penyebab: Seringkali terjadi karena Anda lupa mengatur
LayoutManageruntukRecyclerView, atau lupa memanggilnotifyDataSetChanged()pada adapter setelah menambahkan data awal. Bisa juga karena daftar data yang diberikan ke adapter kosong.Solusi: Pastikan Anda memiliki baris kode seperti
rvTodoItems.layoutManager = LinearLayoutManager(this)danrvTodoItems.adapter = todoAdapter. Juga, pastikan daftartodostidak kosong saat adapter diinisialisasi atau Anda memanggiltodoAdapter.notifyDataSetChanged()setelah menambahkan item pertama. -
Gejala: Aplikasi berhenti mendadak saat diluncurkan kembali setelah menambahkan data.
Penyebab: Ini sering terjadi jika format JSON yang disimpan tidak valid atau ada masalah saat mengonversi string JSON kembali menjadi objek Kotlin. Salah satu penyebab umum adalah saat pertama kali aplikasi dijalankan dan belum ada data tersimpan di
SharedPreferences, sehingga metodegetString()mengembalikan null atau string kosong yang tidak bisa di-parse oleh Gson.Solusi: Selalu cek jika string yang diambil dari
SharedPreferencestidak null atau kosong sebelum mencoba mem-parse dengan Gson. Gunakan bloktry-catchsaat melakukan deserialisasi Gson untuk menanganiJsonSyntaxExceptionatau error parsing lainnya. -
Tampilan UI Tidak Diperbarui Setelah Aksi (Tambah/Selesai/Hapus)
Gejala: Anda melakukan aksi (misalnya, menandai tugas selesai), tapi tampilan di
RecyclerViewtidak berubah.Penyebab: Ini hampir selalu karena lupa memanggil metode
notifyItemInserted(),notifyItemChanged(),notifyItemRemoved(), ataunotifyDataSetChanged()padaTodoAdaptersetelah memodifikasi daftar data diMainActivity.Solusi: Setelah setiap perubahan pada daftar
todos(misalnya, menambah tugas baru, mengubah statusisChecked, menghapus tugas), pastikan untuk memanggil metodenotifyyang relevan padatodoAdapter. Untuk perubahan besar atau ketika banyak item yang berubah,notifyDataSetChanged()bisa digunakan, meskipun metode yang lebih spesifik lebih efisien. -
Kesalahan Import atau Resolusi Dependensi
Gejala: Android Studio menampilkan error “unresolved reference” atau “cannot resolve symbol” untuk kelas-kelas seperti
RecyclerView,Gson, dll.Penyebab: Anda mungkin lupa menambahkan dependensi yang diperlukan di file
build.gradle(Module: app) atau lupa melakukan sinkronisasi proyek setelah menambahkannya.Solusi: Pastikan dependensi untuk
RecyclerView(biasanya sudah ada by default untuk Empty Activity) danGson(jika Anda menggunakannya) sudah ditambahkan dengan benar. Setelah menambahkan atau mengubah dependensi, klik tombol “Sync Now” yang muncul di bilah notifikasi Android Studio atau dari menu “File” -> “Sync Project with Gradle Files”.
Pengalaman dan Pertimbangan Praktis
Membangun aplikasi To Do List dengan Kotlin adalah langkah awal yang sangat baik. Namun, dalam konteks pengembangan nyata, ada beberapa hal yang perlu dipertimbangkan lebih lanjut:
- Skalabilitas Data:
SharedPreferencesbagus untuk data kecil dan sederhana. Namun, jika daftar tugas menjadi sangat banyak atau kompleks (misalnya, dengan prioritas, tanggal jatuh tempo, kategori),SharedPreferencesakan menjadi tidak efisien. Untuk kasus seperti itu, Room Persistence Library (bagian dari Android Architecture Components) adalah pilihan yang jauh lebih baik. Room menyediakan lapisan abstraksi di atas SQLite, membuatnya jauh lebih mudah untuk mengelola database di Android. - UI/UX yang Lebih Baik: Aplikasi kita saat ini sangat fungsional, tetapi dari sisi desain UI/UX, masih banyak yang bisa ditingkatkan. Anda bisa menambahkan animasi, transisi, atau desain material yang lebih menarik. Pertimbangkan juga untuk menambahkan fitur seperti “swipe to delete”, drag-and-drop untuk reordering, atau filter tugas.
- Pengelolaan Status Aplikasi: Untuk aplikasi yang lebih kompleks, mengelola state (keadaan) UI dan data bisa menjadi tantangan. Pola arsitektur seperti MVVM (Model-View-ViewModel) dengan LiveData atau Flow dan ViewModel (bagian dari Android Architecture Components) sangat membantu dalam memisahkan logika bisnis dari UI, membuat aplikasi lebih mudah diuji dan dipelihara.
- Unit Testing: Saat aplikasi semakin kompleks, menguji setiap komponen secara terpisah menjadi sangat penting. Anda bisa menulis unit test untuk
Todomodel,TodoAdapter, dan bahkan logika bisnis diMainActivity(jika Anda memisahkannya ke ViewModel). - Fleksibilitas: Aplikasi To Do List ini sangat spesifik. Dalam praktiknya, Anda mungkin ingin membuat aplikasi yang lebih generik atau modular sehingga bagian-bagian tertentu bisa digunakan kembali di proyek lain.
- Biaya Sumber Daya: Untuk aplikasi sederhana seperti ini, penggunaan RAM dan CPU relatif rendah. Namun, jika Anda mulai menambahkan fitur real-time, sinkronisasi cloud, atau notifikasi yang kompleks, Anda perlu memantau penggunaan sumber daya agar aplikasi tetap responsif dan hemat baterai.
Membangun aplikasi To Do List ini memberikan fondasi yang kuat, dan dari sini Anda bisa mulai menjelajahi topik-topik pengembangan Android yang lebih lanjut.
FAQ
Apa itu RecyclerView dan kenapa kita menggunakannya?
RecyclerView adalah komponen UI di Android yang dirancang untuk menampilkan daftar data yang panjang dan dapat digulir secara efisien. Kita menggunakannya karena lebih efisien daripada ListView tradisional, terutama dalam hal penggunaan memori dan performa, dengan hanya membuat tampilan untuk item yang terlihat di layar.
Tidak. SharedPreferences tidak dirancang untuk menyimpan data sensitif atau data dalam jumlah besar. Data yang disimpan di SharedPreferences bisa diakses oleh aplikasi lain jika perangkat di-root atau jika ada kerentanan keamanan. Untuk data sensitif, gunakan solusi penyimpanan terenkripsi seperti EncryptedSharedPreferences atau database yang aman.
Tentu saja. Untuk data yang lebih terstruktur atau dalam jumlah besar, SQLite adalah pilihan yang lebih baik. Android menyediakan API bawaan untuk SQLite. Namun, cara yang lebih modern dan direkomendasikan adalah menggunakan Room Persistence Library, yang merupakan lapisan abstraksi di atas SQLite dan mempermudah interaksi database dengan Kotlin.
Bagaimana cara menambahkan fungsionalitas edit pada tugas?
Untuk menambahkan fungsionalitas edit, Anda bisa menambahkan sebuah ImageView (misalnya ikon pensil) di samping setiap item tugas. Ketika ikon ini diklik, Anda bisa menampilkan dialog atau membuka Activity baru yang berisi EditText yang sudah terisi dengan judul tugas saat ini, memungkinkan pengguna mengubahnya. Setelah disimpan, perbarui objek Todo yang relevan di daftar dan panggil notifyItemChanged() pada adapter.
Apa perbedaan antara notifyDataSetChanged() dan notifyItemInserted/Changed/Removed()?
notifyDataSetChanged() memberi tahu RecyclerView bahwa seluruh set data mungkin telah berubah, sehingga RecyclerView akan menggambar ulang semua item yang terlihat. Ini kurang efisien. Sebaliknya, notifyItemInserted(), notifyItemChanged(), dan notifyItemRemoved() memberi tahu RecyclerView tentang perubahan spesifik pada satu item atau rentang item, memungkinkan RecyclerView untuk melakukan pembaruan UI yang lebih efisien dan seringkali dengan animasi default.
Kesimpulan
Selamat! Anda telah berhasil membangun aplikasi To Do List Android sederhana menggunakan Kotlin dari awal. Dari setup proyek, desain UI, implementasi adapter RecyclerView, hingga persistensi data dasar dengan SharedPreferences, Anda telah menyentuh berbagai konsep penting dalam pengembangan Android.
Proyek ini adalah fondasi yang kokoh untuk perjalanan Anda sebagai developer Android. Jangan berhenti di sini. Eksplorasi lebih lanjut dengan menambahkan fitur-fitur baru, meningkatkan UI/UX, atau mengganti mekanisme persistensi data dengan Room Database untuk pemahaman yang lebih mendalam. Ingatlah, praktik adalah kunci dalam pembelajaran pemrograman. Teruslah berkarya dan jangan takut untuk bereksperimen!
TAGS: Kotlin, Android, To Do List, Tutorial, Android Studio, RecyclerView, SharedPreferences, Developer Tools, Programming Tutorial, Aplikasi Android


