GridView - CardView - setOnClick
GridView - CardView - setOnClick
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.
3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro
id"
4. xmlns:tools="http://schemas.android.com/tools"
5. android:layout_width="match_parent"
6. android:layout_height="wrap_content"
7. android:orientation="vertical">
8.
9. <ImageView
10. android:id="@+id/img_item_photo"
11. android:layout_width="match_parent"
12. android:layout_height="250dp"
13. android:layout_margin="1dp"
14. android:scaleType="centerCrop"
</LinearLayout>
a. Java
3. public class GridHeroAdapter extends RecyclerView.Adapter<GridHeroAda
pter.GridViewHolder> {
a. Java
public class GridHeroAdapter extends RecyclerView.Adapter<GridHeroAda
pter.GridViewHolder> {
@NonNull
@Override
t, int viewType) {
return null;
@Override
@Override
return 0;
super(itemView);
}
}
b. Java
pter.GridViewHolder> {
this.listHero = list;
...
c. Java
pter.GridViewHolder> {
this.listHero = list;
}
@NonNull
@Override
t, int viewType) {
@Override
, int position) {
Glide.with(holder.itemView.getContext())
.load(listHero.get(position).getPhoto())
.into(holder.imgPhoto);
@Override
return listHero.size();
}
class GridViewHolder extends RecyclerView.ViewHolder {
ImageView imgPhoto;
GridViewHolder(View itemView) {
super(itemView);
imgPhoto = itemView.findViewById(R.id.img_item_photo);
8. rvHeroes.setAdapter(gridHeroAdapter);
a. Java
switch (selectedMode) {
case R.id.action_list:
showRecyclerList();
break;
case R.id.action_grid:
showRecyclerGrid();
break;
case R.id.action_cardview:
break;
2. <androidx.cardview.widget.CardView xmlns:android="http://schema
s.android.com/apk/res/android"
3. xmlns:card_view="http://schemas.android.com/apk/res-auto"
4. xmlns:tools="http://schemas.android.com/tools"
5. android:id="@+id/card_view"
6. android:layout_width="match_parent"
7. android:layout_height="wrap_content"
8. android:layout_gravity="center"
9. android:layout_marginLeft="8dp"
10. android:layout_marginTop="4dp"
11. android:layout_marginRight="8dp"
12. android:layout_marginBottom="4dp"
13. card_view:cardCornerRadius="4dp">
14.
15. <RelativeLayout
16. android:layout_width="match_parent"
17. android:layout_height="200dp"
18. android:padding="8dp">
19.
20. <ImageView
21. android:id="@+id/img_item_photo"
22. android:layout_width="150dp"
23. android:layout_height="220dp"
24. android:layout_marginBottom="4dp"
25. android:scaleType="centerCrop"
27.
28. <TextView
29. android:id="@+id/tv_item_name"
30. android:layout_width="match_parent"
31. android:layout_height="wrap_content"
32. android:layout_marginLeft="16dp"
33. android:layout_marginTop="16dp"
34. android:layout_marginRight="16dp"
35. android:layout_marginBottom="8dp"
36. android:layout_toEndOf="@id/img_item_photo"
37. android:layout_toRightOf="@id/img_item_photo"
38. android:textSize="16sp"
39. android:textStyle="bold"
41.
42. <TextView
43. android:id="@+id/tv_item_detail"
44. android:layout_width="match_parent"
45. android:layout_height="match_parent"
46. android:layout_above="@+id/layout_button"
47. android:layout_below="@id/tv_item_name"
48. android:layout_marginLeft="16dp"
49. android:layout_marginRight="16dp"
50. android:layout_toEndOf="@id/img_item_photo"
51. android:layout_toRightOf="@id/img_item_photo"
52. android:ellipsize="end"
53. android:maxLines="5"
55.
56. <LinearLayout
57. android:id="@+id/layout_button"
58. android:layout_width="match_parent"
59. android:layout_height="wrap_content"
60. android:layout_alignParentBottom="true"
61. android:layout_marginStart="16dp"
62. android:layout_marginLeft="16dp"
63. android:layout_toEndOf="@id/img_item_photo"
64. android:layout_toRightOf="@id/img_item_photo"
65. android:orientation="horizontal">
66.
67. <Button
68. android:id="@+id/btn_set_favorite"
69. style="@style/Widget.AppCompat.Button.Color
ed"
70. android:layout_width="match_parent"
71. android:layout_height="wrap_content"
72. android:layout_weight="1"
73. android:text="@string/favorite"
75.
76. <Button
77. android:id="@+id/btn_set_share"
78. style="@style/Widget.AppCompat.Button.Color
ed"
79. android:layout_width="match_parent"
80. android:layout_height="wrap_content"
81. android:layout_weight="1"
82. android:text="@string/share"
84. </LinearLayout>
85. </RelativeLayout>
86. </androidx.cardview.widget.CardView>
2. Setelah selesai, buat kembali kelas Adapter dengan
nama CardViewHeroAdapter.
o Java
2. public class CardViewHeroAdapter extends RecyclerView.Adapter<C
ardViewHeroAdapter.CardViewViewHolder>{
3. }
o Java
5. public class CardViewHeroAdapter extends RecyclerView.Adapter<C
ardViewHeroAdapter.CardViewViewHolder>{
6. @NonNull
7. @Override
9. return null;
10. }
11.
12. @Override
14.
15. }
16.
17. @Override
19. return 0;
20. }
21.
ewHolder {
24. super(itemView);
25. }
26. }
27. }
o Java
29. public class CardViewHeroAdapter extends RecyclerView.Adapt
er<CardViewHeroAdapter.CardViewViewHolder>{
31.
32. public CardViewHeroAdapter(ArrayList<Hero> list) {
34. }
35.
36. ...
37. }
o Java
39. public class CardViewHeroAdapter extends RecyclerView.Adapt
er<CardViewHeroAdapter.CardViewViewHolder> {
41.
44. }
45.
46. @NonNull
47. @Override
52.
53. @Override
55.
57.
58. Glide.with(holder.itemView.getContext())
59. .load(hero.getPhoto())
50))
61. .into(holder.imgPhoto);
62.
63. holder.tvName.setText(hero.getName());
64. holder.tvDetail.setText(hero.getDetail());
65.
ickListener() {
67. @Override
69. Toast.makeText(holder.itemView.getContext()
, "Favorite " +
70. listHero.get(holder.getAdapterPosit
ion()).getName(), Toast.LENGTH_SHORT).show();
71.
72. }
73. });
74.
Listener() {
76. @Override
78. Toast.makeText(holder.itemView.getContext()
, "Share " +
79. listHero.get(holder.getAdapterPosit
ion()).getName(), Toast.LENGTH_SHORT).show();
80. }
81. });
82. }
83.
84. @Override
87. }
88.
r {
93.
95. super(itemView);
photo);
e);
etail);
t_favorite);
hare);
101. }
102. }
103. }
2. rvHeroes.setLayoutManager(new LinearLayoutManager(this));
dapter(list);
4. rvHeroes.setAdapter(cardViewHeroAdapter);
5. }
o Java
7. public void setMode(int selectedMode) {
8. switch (selectedMode) {
9. case R.id.action_list:
10. showRecyclerList();
11. break;
12.
14. showRecyclerGrid();
15. break;
16.
18. showRecyclerCardView();
19. break;
20. }
21. }
2. if (getSupportActionBar() != null) {
3. getSupportActionBar().setTitle(title);
4. }
5. }
o Java
7. private String title = "Mode List";
o Java
9. public void setMode(int selectedMode) {
13. showRecyclerList();
14. break;
15.
18. showRecyclerGrid();
19. break;
20.
23. showRecyclerCardView();
24. break;
25. }
26. setActionBarTitle(title);
27. }
o Java
29. @Override
31. super.onCreate(savedInstanceState);
32. setContentView(R.layout.activity_main);
33. setActionBarTitle(title);
34.
35. ...
36. }
6. Jalankan kembali aplikasinya. Sekarang judul halaman akan berubah
seiring perubahan bentuk RecyclerView.
Codelab ItemOnClickListener
Listview memiliki listener untuk melakukan sebuah aksi ketika salah satu
item pada list dipilih. Sementara itu, pada RecyclerView kita harus
membuatnya secara manual.
Pada modul ini, kita akan mengupas bagaimana caranya menangani
kejadian ketika salah satu item pada list di RecyclerView dipilih.
ner() {
3. @Override
5. Toast.makeText(holder.itemView.getContext(), "Favorite
" +
6. listHero.get(holder.getAdapterPosition()).getNa
me(), Toast.LENGTH_SHORT).show();
7.
8. }
9. });
10.
() {
12. @Override
" +
15. listHero.get(holder.getAdapterPosition()).g
etName(), Toast.LENGTH_SHORT).show();
16. }
17. });
Jika diperhatikan, kode di atas digunakan untuk
menambahkan onClick untuk btnFavorite dan btnShare.
Lalu bagaimana mengimplementasikan untuk seluruh item di dalam
RecyclerView?
o Java
19. holder.itemView.setOnClickListener(new View.OnClickListener
() {
20. @Override
, Toast.LENGTH_SHORT).show();
23. }
24. });
eroAdapter.ListViewHolder> {
2. ...
3.
5.
emClickCallback) {
7. this.onItemClickCallback = onItemClickCallback;
8. }
9.
10. ...
11.
12. @Override
14. ...
15.
16. holder.itemView.setOnClickListener(new View.OnClick
Listener() {
17. @Override
19. onItemClickCallback.onItemClicked(listHero.
get(holder.getAdapterPosition()));
20. }
21. });
22. }
23.
24. ...
25.
28. }
29. }
o Java
31. private void showSelectedHero(Hero hero) {
Toast.LENGTH_SHORT).show();
33. }
Kemudian tambahkan pada masing-masing metode di list seperti
berikut:
o Java
35. private void showRecyclerList() {
);
ist);
38. rvHeroes.setAdapter(listHeroAdapter);
39.
ter.OnItemClickCallback() {
41. @Override
43. showSelectedHero(data);
44. }
45. });
46. }
eroAdapter.GridViewHolder> {
2. ...
3.
4. private OnItemClickCallback onItemClickCallback;
5.
emClickCallback) {
7. this.onItemClickCallback = onItemClickCallback;
8. }
9.
10. ...
11.
12. @Override
14. ...
15.
Listener() {
17. @Override
19. onItemClickCallback.onItemClicked(listHero.
get(holder.getAdapterPosition()));
20. }
21. });
22. }
23.
24. ...
25.
28. }
29. }
o Java
31. private void showRecyclerGrid() {
));
ist);
34. rvHeroes.setAdapter(gridHeroAdapter);
35.
ter.OnItemClickCallback() {
37. @Override
39. showSelectedHero(data);
40. }
41. });
42. }
4. Sekarang jalankan kembali aplikasinya. Klik salah satu item
pada RecyclerView bentuk list dan grid. Seharusnya sebuah
obyek Toast akan tampil ketika salah satu item ditekan.
Bedah Kode
RecyclerView
Pendekatan umum dalam mengembangkan aplikasi mobile terletak pada
bentuk list-to-detail. Pendekatan ini menampilkan sejumlah informasi dalam
bentuk list. Ketika pengguna menekan salah satu item untuk mendapatkan
detail informasi, maka aplikasi akan menampilkannya secara detail.
Pendekatan tersebut sangat lumrah dikarenakan keterbatasan ukuran
layar. Keterbatasan ini justru memudahkan penggunaan dua jempol
sebagai pointer untuk melakukan sebuah aksi pada aplikasi.
Java
1. public class ListHeroAdapter extends RecyclerView.Adapter<ListHeroAd
apter.ListViewHolder> {
ckCallback) {
6. this.onItemClickCallback = onItemClickCallback;
7. }
9. this.listHero = list;
10. }
11.
12. @NonNull
13. @Override
wGroup, int i) {
17. }
18.
19. @Override
22.
23. Glide.with(holder.itemView.getContext())
24. .load(hero.getPhoto())
25. .apply(new RequestOptions().override(55, 55))
26. .into(holder.imgPhoto);
27.
28. holder.tvName.setText(hero.getName());
29. holder.tvDetail.setText(hero.getDetail());
30.
() {
32. @Override
34. onItemClickCallback.onItemClicked(listHero.get(hold
er.getAdapterPosition()));
35. }
36. });
37. }
38.
39. @Override
42. }
43.
47.
48. ListViewHolder(View itemView) {
49. super(itemView);
53. }
54. }
55.
58. }
59. }
Java
1. rvHeroes.setHasFixedSize(true);
Pada contoh kode di atas, kita menggunakan library bernama Glide untuk
menampilkan foto secara asynchronous dari URL yang diberikan.
Java
1. rvHeroes.setLayoutManager(new LinearLayoutManager(this));
atau
Java
RecylerView
Using the RecyclerView
Fundamentals for ListView
RecyclerView Animator
Glide
Perhatikan kode berikut:
Java
1. Glide.with(holder.itemView.getContext())
2. .load(listHero.get(position).getPhoto())
Glide digunakan untuk memuat sebuah gambar, baik yang sudah Anda
siapkan di drawable maupun berada di server. Glide terdiri dari banyak
fungsi:
Java
1. Glide.with(holder.itemView.getContext())
2. .load(R.drawable.my_profile)
4. .into(holder.imgPhoto);