RecyclerView di ViewPager2
Setelah dengar kabar ViewPager2 versi alphanya sudah rilis, saya excited banget nih pengen cobain soalnya akan menggunakan RecyclerView yang dapat mendongkrak banyak peningkatan. Namun sayangnya belum sempat mencobanya karena padatnya jadwal sekolah sejak februari lalu. So lets get into it!
Apa Yang baru ?
- Right-to-left (RTL) layout support
- Vertical orientation support
notifyDataSetChanged
fully functional (VP1 bugs addressed)
Apa Yang Berubah ?
FragmentStateAdapter
replacesFragmentStatePagerAdapter
RecyclerView.Adapter
replacesPagerAdapter
(YEAYY)registerOnPageChangeCallback
replacesaddPageChangeListener
Mari kita coba gunakan ini dengan sekenario yang sering digunakan di RecyclerView (Menampilan data dari model data dalam ArrayList), di sini saya menggunakan kotlin (Link source code project ada di akhir artikel ini, jadi baca sampai akhir ya)
Import Dulu Dong
Import ViewPager2 dengan cara masukan ini ke dependencies di build.gradle (Module: app)
implementation "androidx.viewpager2:viewpager2:1.0.0-alpha01"
Persiapan Layout
Mari kita buat Activity/Fragment baru lalu pasangkan ViewPager2 ke layout kita
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/vp_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Lalu siapkan pula layout yang akan ditampilkan di ViewPager nanti
vp_item.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
android:id="@+id/layout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_item"
android:layout_gravity="center"
android:gravity="center"
android:textColor="@android:color/white"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="24sp"
android:text="Hey" />
</FrameLayout>
Mulai Coding
Mari kita buat model datanya terlebih dahulu
PageModel.kt
data class PageModel(var message:String, var color:Int)
Selanjutnya, kita buat adapter. Tidak perlu tambah yang aneh aneh, kamu cukup buat adapter seperti adapter untuk RecyclerView pada umumnya
VPMainAdapter.kt
Lalu kita sesuaikan adapter itu dengan apa yang kita butuhkan, jadi seperti ini
Next, kita masuk ke activity kita. Buat ArrayList dari PageModel
val data: ArrayList<PageModel> = ArrayList()
Buat function untuk menambahkan data ke ArrayList tersebut
private fun addData(message:String, color:Int){
data.add(PageModel(message, color))
}
Lalu kita buat function untuk mengisi data tersebut
private fun prepareData() {
addData("I'm Angry >:(", android.R.color.holo_red_dark)
addData("I'm sad :'(", android.R.color.holo_blue_dark)
addData("I'm happy :D", android.R.color.holo_green_dark)
}
Buat function untuk mempersiapkan ViewPager kita
private fun prepareViewPager() {
vp_main.adapter = VPMainAdapter(data)
}
Next di onCreate atau function awal kita, kita panggil function untuk mengisi data dan mempersiapkan ViewPager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
prepareData()
prepareViewPager()
}
Hasil Akhir :
Viola, dengan ini kita sudah dapat menampilkan hasil yang sama dengan ViewPager lama dan PagerAdapter.
Lalu Bagaiman Cara Biar Jadi Vertical ?
Simple, cukup tambah line ini di dalam function prepareViewPager
vp_main.orientation = ViewPager2.ORIENTATION_VERTICAL
Dengan digunakannya RecyclerView disini, kita jadi bisa memanfaatkan fitur fitur RecyclerView yang lain seperti memasang animasi. Cara pemasangannya juga sama seperti RecyclerView (Pastikan kamu sudah punya file animasinya di project kamu, jika belum silahkan baca tutorial ini)
Kotlin:
val animation = AnimationUtils.loadLayoutAnimation(this, R.anim.layout_animation_fall_down)
vp_main.layoutAnimation = animation
XML:
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/vp_main"
android:layoutAnimation="@anim/item_animation_fall_down"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Masih banyak lagi efek positif dari versi baru dari ViewPager ini seperti support untuk RTL,registerOnPageChangeCallback
yang membuat kode kita jauh lebih rapi dan efisien dan FragmentStateAdapter
yang meningkatkan performa ViewPager2 ini.
Ettt Sebentar Dulu
Perlu diingat, ViewPager2 masih dalam tahap alpha jadi masih perlu pengerjaan lebih lanjut untuk mencapai versi stabil. Adapun bug yang diketahui saat artikel ini ditulis adalah
Known issues
- clipToPadding
- no fakeDrag
- JavaDoc
- nested scrolling parallel to orientation
- no offscreen limit control
- needs better TabLayout integration
- no pageWidth setter (forced 100%/100%)
- page transformer: no hardware/software layer choice; no reverse drawing order
- keep current item visible when inserting a page before current
- keyboard navigation needs work
FragmentStateAdapter
stability / performance improvements coming
Source code project dari yang saya contohkan juga tersedia di GitHub
Sekian dari saya, semoga bermanfaat and …
Happy Coding !