ImageView & Recycle View
ImageView & Recycle View
ImageView
1. Defenisi ImageView
Adalah komponen dasar android yang tugasnya menampilkan gambar. Gambar di
komponen ImageView bisa diambil dari Assets atau dari Drawable. ImageView memiliki tinggi dan
lebar yang sudah ditentukan sejak awal.
2. Menerapkan ImageView
Berikut potongan kode program untuk menerapkan ImageView
<ImageView
android:id=”@+id/image”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:scaltType=”center”
android:src=”@drawable/my_image”
/>
View ini secara umum akan memuat gambar dari drawable bernama my_image. Atribut
scaleType memungkinkan pengguna untuk memosisikan sebuah gambar di dalam ImageView.
Pada contoh diatas, akan ditampilkan gambar dengan ukuran aslinya dan berada di tengah
ImageView.
4. ScaleType
Sebuah ImageView dapat menampilkan gambar berdasarkan atribut scaleType yang
diberikan. Berikut ini beberapa properti atribut scaleType.
a. Center
Menampilkan gambar ditengah view tanpa merubah skalanya.
b. centerCrop
merubah skala gambar sehingga dimensi x dan y lebih besar atau sama dengan view dengan
menjaga aspek rasionya, lalu menampilkan gambar di tengah view
c. centerInside
merubah skala gambar agar pas didalam view dengan menjaga aspek rasionya. Jika ukuran
gambar lebih kecil dari view, maka hasil yang didapatkan sama seperti center.
d. Matrix
Merubah skala gambar melalui kelas matrix. Matrix ini dapat diberikan lewat method
setImageMatrix. Kelas matrix dapat melakukan transformasi, misalnya memutar gambar
e. fitCenter
menampilkan gambar agar pas berada di dalam view dengan menjaga aspek rasionya.
Setidaknya akan ada satu sisi yang pas dengan view, lalu hasilnya ditampilkan di tengah.
f. fitStart
sama seperti fitCenter tapi sejajar dengan posisi kiri atas dari view
g. fitEnd
sama seperti fitCenter tapi sejajar dengan posisi kanan atas dari view
h. fitXY
merubah dimensi x dan y agar pas dengan ukuran view; aspek ratio gambar tidak dijaga
3. Penerapan RecyclerView
a. Langkah Pertama : Tambahkan Dependency untuk recycler view dan card view pada
gradle file kalian.
//recycler view
implementation "androidx.recyclerview:recyclerview:1.1.0"
// card view
implementation "androidx.cardview:cardview:1.0.0"
b. Langkah Kedua : Buat item xml masing-masing utuk card promo dan card load more
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardCornerRadius="5dp"
app:cardElevation="10dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageBanner"
android:layout_width="300dp"
android:layout_height="100dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/titleBadgePromo"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:text="TextView"
android:textSize="14sp"
app:layout_constraintEnd_toEndOf="@+id/imageBanner"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/imageBanner"
app:layout_constraintTop_toBottomOf="@+id/imageBanner" />
<TextView
android:id="@+id/titlePromo"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp"
android:text="TextView"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/titleBadgePromo"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/titleBadgePromo"
app:layout_constraintTop_toBottomOf="@+id/titleBadgePromo"
app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
Code untuk item_promo.xml
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="24dp">
<ImageView
android:id="@+id/imageView2"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/ic_baseline_chevron_right_24"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/titleLoadMore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:text="View ALL"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/imageView2"
app:layout_constraintStart_toStartOf="@+id/imageView2"
app:layout_constraintTop_toBottomOf="@+id/imageView2" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
Code untuk item_load_more.xml
c. Langkah 3 : Buat Model untuk Promo dan Load More dengan Menggunakan Data Class
pada Kotlin.
data class Promo(val imagePromo: String, val titleBadge: String, val title: String)
promo.kt
data class LoadMore(val title: String)
LeadMore.kt
Cukup satu baris saja, dengan menggunakan keyword data kita telah membuat setter
dan getter otomatis untuk semua parameternya. The Amazing of kotlin !!!
Code tersebut digunakan untuk mempermudah membuat Recyler View Holder dengan
model yang akan berbeda-beda dan akan menjadi multiple view nantinya.
e. Langkah 5: Buat adapter Recyler view untuk menampung data yang berbeda.
Kita buat dulu class dengan extends ke RecylerView.Adapter yang akan berisi
BaseViewHolder
class DataAdapter(private val context: Context) :
RecyclerView.Adapter<BaseViewHolder<*>>() {}
Tambahkan muttable list kosong dan fungsi untuk menambahkan data kedalam muttable
list tersebut.
private val adapterDataList: MutableList<Any> = mutableListOf()private fun addData(item:
Any) {
adapterDataList.add(item)
notifyItemChanged(adapterDataList.size - 1)
}
Buat inner class Promo View Holder dan Load More View Holder yang merupakan
child/turunan dari BaseViewHolder. Class tersebut berfungsi untuk set data model pada
item view kita.
inner class PromoViewHolder(itemView: View) : BaseViewHolder<Promo>(itemView) {
override fun bind(item: Promo) {
itemView.apply {
val resId = resources.getIdentifier(item.imagePromo, "drawable",
context.packageName)
imageBanner.setBackgroundResource(resId)
titleBadgePromo.text = item.titleBadge
titlePromo.text = item.title
}
}
}
Setelah itu di bagian class data adapter pasti masih terdapat error, coba
lakukan alt+enter kita diminta untuk mengimplement 3 fungsi
onCreateViewHolder, getItemCount dan onBindViewHolder. Pilih ketiga fungsi
tersebut dan mulai implementasi.
Pada onCreateViewHolder inilah kita akan mengembalikan nilai view holder sesuai
dengan type masing-masing. kita juga memasukan view kedalam masing View Holder
disini.
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<*> {
return when (viewType) {
TYPE_PROMO -> {
val view = LayoutInflater.from(context).inflate(R.layout.item_promo, parent,false)
PromoViewHolder(view)
}
TYPE_LOAD_MORE -> {
val view =
LayoutInflater.from(context).inflate(R.layout.item_load_more, parent,false)
LoadMoreViewHolder(view)
}
else -> throw IllegalArgumentException("Invalid view type")
}
}
Pada fungsi onBindViewHolder digunakan mapping data kepada tiap-tiap view holder.
override fun onBindViewHolder(holder: BaseViewHolder<*>, position: Int) {
val element = adapterDataList[position]
when (holder) {
is PromoViewHolder -> holder.bind(element as Promo)
is LoadMoreViewHolder -> holder.bind(element as LoadMore)
else -> throw IllegalArgumentException()
}
}
Pada fungsi getItemCount digunakan untuk menentukan jumlah item pada Recylerview
override fun getItemCount(): Int {
return adapterDataList.size
}
Ini yang terpenting, untuk menentukan jenis / type pada masing-masing data kita
perlu ovveride getItemViewType.
override fun getItemViewType(position: Int): Int {
return when (adapterDataList[position]) {
is Promo -> TYPE_PROMO
is LoadMore -> TYPE_LOAD_MORE
else -> throw IllegalArgumentException("Invalid type of data " + position)
}
}
companion object {
private const val TYPE_PROMO = 0
private const val TYPE_LOAD_MORE = 1
}
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerPromo"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
g. Langkah 6 : Tambahkan adapter, layout manager, data list pada recycler view.
package com.galangaji.recylermultipleview
import android.graphics.Rect
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.*
import com.galangaji.recylermultipleview.model.LoadMore
import com.galangaji.recylermultipleview.model.Promo
import kotlinx.android.synthetic.main.activity_main.*
dataAdapter = DataAdapter(this)
manager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
recyclerPromo.apply {
adapter = dataAdapter
layoutManager = manager
addItemDecoration(object : ItemDecoration() {
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: State
) {
outRect.set(10, 10, 10, 10)
}
}
)
}
dataAdapter.addAllData(dataList)
}
}
Selesai….
Jalankan dan lihat hasilnya akan tampil seperti gambar dibawah ini.