RecyclerView Mode Grid
RecyclerView Mode Grid
Pada modul sebelumnya, kita telah membuat menu pada aplikasi daftar Pahlawan yang
sedang kita buat. Mari kita lanjutkan pembuatan bentuk dari RecyclerView dalam
bentuk grid.
1. Buat sebuah berkas layout xml baru dengan nama item_grid_hero.
2. Setelah selesai, lanjut ke pembuatan Adapter untuk berkas layout xml tersebut. Buat
sebuah kelas baru dengan nama GridHeroAdapter.
Kemudian kita lakukan hal yang sama dengan pembuatan ListHeroAdapter, lengkapi
kodenya menjadi seperti berikut:
public class GridHeroAdapter extends
RecyclerView.Adapter<GridHeroAdapter.GridViewHolder> {
Setelah itu kita akan perbaiki eror dengan cara menekan alt+enter atau klik lampu
merahnya. Setelah memperbaiki maka akan menjadi seperi ini:
public class GridHeroAdapter extends
RecyclerView.Adapter<GridHeroAdapter.GridViewHolder> {
@NonNull
@Override
public GridViewHolder onCreateViewHolder(@NonNull ViewGroup
viewGroup, int i) {
return null;
}
@Override
public void onBindViewHolder(@NonNull GridViewHolder gridViewHolder,
int i) {
}
@Override
public int getItemCount() {
return 0;
}
public class GridViewHolder extends RecyclerView.ViewHolder {
public GridViewHolder(@NonNull View itemView) {
super(itemView);
}
}
}
Kemudian buatlah constructor untuk list seperti ini:
public class GridHeroAdapter extends
RecyclerView.Adapter<GridHeroAdapter.GridViewHolder> {
private ArrayList<Hero> listHero;
<ImageView
android:id="@+id/img_item_photo"
android:layout_width="150dp"
android:layout_height="220dp"
android:layout_marginBottom="4dp"
android:scaleType="centerCrop"
tools:src="@color/colorAccent" />
<TextView
android:id="@+id/tv_item_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="8dp"
android:layout_toEndOf="@id/img_item_photo"
android:layout_toRightOf="@id/img_item_photo"
android:textSize="16sp"
android:textStyle="bold"
tools:text="@string/heroes_name" />
<TextView
android:id="@+id/tv_item_detail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/layout_button"
android:layout_below="@id/tv_item_name"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_toEndOf="@id/img_item_photo"
android:layout_toRightOf="@id/img_item_photo"
android:ellipsize="end"
android:maxLines="5"
tools:text="@string/detail" />
<LinearLayout
android:id="@+id/layout_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_toEndOf="@id/img_item_photo"
android:layout_toRightOf="@id/img_item_photo"
android:orientation="horizontal">
<Button
android:id="@+id/btn_set_favorite"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/favorite"
android:textSize="12sp" />
<Button
android:id="@+id/btn_set_share"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/share"
android:textSize="12sp" />
</LinearLayout>
</RelativeLayout>
</androidx.cardview.widget.CardView>
2. Setelah selesai, buat kembali kelas Adapter dengan nama CardViewHeroAdapter.
Kemudian kita lakukan hal yang sama dengan pembuatan LisHeroAdapter. Lengkapi
kodenya menjadi seperti berikut:
public class CardViewHeroAdapter extends
RecyclerView.Adapter<CardViewHeroAdapter.CardViewViewHolder>{
}
Setelah itu kita akan perbaiki eror dengan cara menekan alt+enter atau klik lampu
merahnya. Setelah memperbaiki maka akan menjadi seperi ini:
public class CardViewHeroAdapter extends
RecyclerView.Adapter<CardViewHeroAdapter.CardViewViewHolder>{
@NonNull
@Override
public CardViewViewHolder onCreateViewHolder(@NonNull ViewGroup
viewGroup, int i) {
return null;
}
@Override
public void onBindViewHolder(@NonNull CardViewViewHolder
cardViewViewHolder, int i) {
}
@Override
public int getItemCount() {
return 0;
}
Glide.with(holder.itemView.getContext())
.load(hero.getPhoto())
.apply(new RequestOptions().override(350, 550))
.into(holder.imgPhoto);
holder.tvName.setText(hero.getName());
holder.tvDetail.setText(hero.getDetail());
holder.btnFavorite.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
Toast.makeText(holder.itemView.getContext(), "Favorite "
+
listHero.get(holder.getAdapterPosition()).getName(),
Toast.LENGTH_SHORT).show();
}
});
holder.btnShare.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(holder.itemView.getContext(), "Share " +
listHero.get(holder.getAdapterPosition()).getName(),
Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return listHero.size();
}
class CardViewViewHolder extends RecyclerView.ViewHolder {
ImageView imgPhoto;
TextView tvName, tvDetail;
Button btnFavorite, btnShare;
CardViewViewHolder(View itemView) {
super(itemView);
imgPhoto = itemView.findViewById(R.id.img_item_photo);
tvName = itemView.findViewById(R.id.tv_item_name);
tvDetail = itemView.findViewById(R.id.tv_item_detail);
btnFavorite = itemView.findViewById(R.id.btn_set_favorite);
btnShare = itemView.findViewById(R.id.btn_set_share);
}
}
}
3. Setelah selesai, kita perlu menambahkan satu metode lagi untuk menampilkan
bentuk RecyclerView ini. Caranya lengkapi kode pada MainActivity menjadi seperti
berikut:
private void showRecyclerCardView(){
rvHeroes.setLayoutManager(new LinearLayoutManager(this));
CardViewHeroAdapter cardViewHeroAdapter = new
CardViewHeroAdapter(list);
rvHeroes.setAdapter(cardViewHeroAdapter);
}
Dan update metode onOptionsItemSelected() menjadi seperti berikut:
public void setMode(int selectedMode) {
switch (selectedMode) {
case R.id.action_list:
showRecyclerList();
break;
case R.id.action_grid:
showRecyclerGrid();
break;
case R.id.action_cardview:
showRecyclerCardView();
break;
}
}
4. Jalankan kembali aplikasinya. Seharusnya Anda sudah bisa menampilkan tiga
bentuk RecyclerView yang telah kita rencanakan sebelumnya.
5. Untuk mempercantik tampilan dan memenuhi target di awal, kita akan menambah
metode untuk mengubah judul halaman setiap melakukan perubahan bentuk
dari RecyclerView.
private void setActionBarTitle(String title) {
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle(title);
}
}
Kemudian tambahkan variable baru diatas metode onCreate() seperti berikut:
private String title = "Mode List";
Dan kita update kembali metode setMode sehingga menjadi seperti berikut:
public void setMode(int selectedMode) {
switch (selectedMode) {
case R.id.action_list:
title = "Mode List";
showRecyclerList();
break;
case R.id.action_grid:
title = "Mode Grid";
showRecyclerGrid();
break;
case R.id.action_cardview:
title = "Mode CardView";
showRecyclerCardView();
break;
}
setActionBarTitle(title);
}
Dan pada metode onCreate() tambahkan baris ini setActionBarTitle("Mode
List"); sebelum kita memanggil metode showRecyclerList(); untuk
mengganti title sejak pertama kali aplikasi dijalankan.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setActionBarTitle(title);
...
}
6. Jalankan kembali aplikasinya. Sekarang judul halaman akan berubah seiring
perubahan bentuk RecyclerView.