Blog Tutorial Android Bagi Pemula

Sunday, November 22, 2020

Android RecyclerView Dengan Multiple Item Selection (Konsep Layout TV Shows)

Pada kesempatan ini blog gwnbs akan kembali membahas Android RecyclerView dimana kali ini akan dicontohkan multiple selection (dapat memilih lebih dari satu item) untuk item-item RecyclerView pada sebuah aplikasi program TV series. Aplikasi ini belum disempurnakan, mungkin nanti akan disempurnakan dan diposting di blog ini jika ada kesempatan. 




Android RecyclerView Multiple Item Selection
Gambar 1 : Screenshoot dari struktur project pada contoh ini.

Nama package pada contoh ini adalah com.gwnbs.rvmultiple. Pertama yang kita lakukan adalah memasukkan 2 library yakni RoundedImageview dan library RecyclerView itu sendiri ke file build.gradle(Module: app). Berikut di bawah keseluruhan isi dari file ini.

build.gradle(Module: app) :
apply plugin: 'com.android.application'

android {
compileSdkVersion 29
buildToolsVersion "29.0.3"

defaultConfig {
applicationId "com.gwnbs.rvmultiple"
minSdkVersion 19
targetSdkVersion 29
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
//Library bawaan
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

//Tambahan Library yang dibutuhkan
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.makeramen:roundedimageview:2.3.0'
}


Dalam tutorial ini, akan terdapat 8 item RecyclerView dimana setiap item akan terdiri dari gambar poster, nama, pembuat, rating, dan cuplikan cerita dari program TV tersebut. Seluruh gambar saya unduh dari pencarian Google. Jika Anda mengikuti contoh ini, silahkan download disini kemudian copy gambar-gambar tersebut dan tempatkan di folder drawable project Anda.

Selanjutnya 2 buah icon xml sebagai tombol menu dan tombol pencarian, letaknya juga di folder drawable, dapat dibuat melalui Vector Asset di Android Studio. Untuk saat ini, kedua icon tombol tersebut hanya sebagai penghias semata (belum difungsikan). Berikut isi dari kedua icon xml tersebut.

ic_menu.xml :
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M4,18h16c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1L4,16c-0.55,0 -1,0.45 -1,1s0.45,1 1,1zM4,13h16c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1L4,11c-0.55,0 -1,0.45 -1,1s0.45,1 1,1zM3,7c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1L4,6c-0.55,0 -1,0.45 -1,1z"/>
</vector>

ic_search.xml :
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M15.5,14h-0.79l-0.28,-0.27c1.2,-1.4 1.82,-3.31 1.48,-5.34 -0.47,-2.78 -2.79,-5 -5.59,-5.34 -4.23,-0.52 -7.79,3.04 -7.27,7.27 0.34,2.8 2.56,5.12 5.34,5.59 2.03,0.34 3.94,-0.28 5.34,-1.48l0.27,0.28v0.79l4.25,4.25c0.41,0.41 1.08,0.41 1.49,0 0.41,-0.41 0.41,-1.08 0,-1.49L15.5,14zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
</vector>


Kemudian kita juga akan membutuhkan 2 buah background drawable yang dapat dibuat melalui Drawable Resource File. Letaknya juga berada di dalam folder drawable. Background ini difungsikan untuk item saat dipilih. Berikut isi kedua file ini.

tvshow_bg.xml :
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<solid android:color="@color/colorTextIcons"/>
<corners android:radius="6dp"/>

</shape>

tvshow_selected_bg.xml :
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<solid android:color="@color/colorTextIcons"/>
<corners android:radius="6dp"/>
<stroke
android:width="2dp"
android:color="@color/colorAccent"/>

</shape>


Sebelum kita memulai layout dan koding java, berikut isi dari value colors.xml dan styles.xml yang digunakan untuk contoh ini.

colors.xml :
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#41D3BD</color>
<color name="colorPrimaryDark">#41D3BD</color>
<color name="colorAccent">#FDA14F</color>
<color name="colorTextIcons">#FFFFFF</color>
<color name="colorTextPrimary">#212121</color>
<color name="colorTextSecondary">#757575</color>
<color name="colorRartingActive">#FDA14F</color>
<color name="colorRatingInactive">#C9C9D1</color>
<color name="colorBackground">#EEEEEE</color>
</resources>

styles.xml :
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>

<style name="RatingBar" parent="AppTheme">
<item name="colorControlActivated">@color/colorRartingActive</item>
<item name="colorControlNormal">@color/colorRatingInactive</item>
</style>

</resources>



Ada 2 layout yang digunakan dalam contoh ini, yakni layout untuk activity dan layout untuk item-item pada RecyclerView. Untuk layout activity yaitu activity_main.xml, terdapat 5 komponen view didalamnya : sebuah TextView, 2 buah ImageView, sebuah Button, dan sebuah RecyclerView tentunya. Berikut isinya :

activity_main.xml :
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
android:background="@color/colorBackground"
tools:context=".MainActivity">

<LinearLayout
android:id="@+id/layoutHeader"
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:orientation="horizontal"
android:background="@color/colorPrimary"
android:gravity="center_vertical"
android:padding="10dp"
app:layout_constraintTop_toTopOf="parent">

<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:contentDescription="@string/app_name"
android:src="@drawable/ic_menu"
app:tint="@color/colorTextIcons" />

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:gravity="center"
android:text="TV Shows"
android:textColor="@color/colorTextIcons"
android:textSize="16sp"
android:textStyle="bold"/>

<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:contentDescription="@string/app_name"
android:src="@drawable/ic_search"
app:tint="@color/colorTextIcons" />

</LinearLayout>

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/tvShowsRv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:clipToPadding="false"
android:orientation="vertical"
android:padding="5dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toTopOf="@id/btnAddWatchlist"
app:layout_constraintTop_toBottomOf="@id/layoutHeader"/>

<Button
android:id="@+id/btnAddWatchlist"
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="Add to Watchlist"
android:textAllCaps="false"
android:textColor="@color/colorTextPrimary"
android:textSize="15sp"
android:textStyle="bold"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>


Selanjutnya layout untuk untuk item pada RecyclerView  memiliki 8 komponen view yakni : 2 buah View, sebuah RoundedImageView (berasal dari library yang ditambahkan sebelumnya pada file buil.gradle), sebuah RatingBar, sebuah ImageView, dan 3 buah TextView. Layout ini kita beri nama item_rv_tvshows.xml. Berikut isinya :

item_rv_tvshows.xml :
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/layoutTvshow"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp">

<View
android:id="@+id/viewSupporter"
android:layout_width="match_parent"
android:layout_height="15dp"
app:layout_constraintTop_toBottomOf="@id/imageTvshow"/>

<View
android:id="@+id/viewBackground"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@drawable/tvshow_bg"
android:paddingBottom="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="@+id/textName"/>

<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/imageTvshow"
android:layout_width="110dp"
android:layout_height="130dp"
android:layout_marginStart="15dp"
android:contentDescription="@string/app_name"
android:scaleType="centerCrop"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:riv_corner_radius="6dp"/>

<TextView
android:id="@+id/textName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="35dp"
android:layout_marginEnd="10dp"
android:paddingTop="15dp"
android:textColor="@color/colorTextPrimary"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/imageTvshow"
app:layout_constraintTop_toTopOf="@id/imageTvshow"/>

<RatingBar
android:id="@+id/ratingBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Widget.AppCompat.RatingBar.Small"
android:isIndicator="true"
android:numStars="5"
android:theme="@style/RatingBar"
app:layout_constraintStart_toStartOf="@id/textName"
app:layout_constraintTop_toBottomOf="@id/textName"/>

<TextView
android:id="@+id/textCreatedBy"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/colorTextSecondary"
android:textSize="17sp"
app:layout_constraintEnd_toEndOf="@id/textName"
app:layout_constraintStart_toStartOf="@id/textName"
app:layout_constraintTop_toBottomOf="@id/ratingBar"/>

<TextView
android:id="@+id/textStory"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/colorTextSecondary"
android:textSize="13sp"
app:layout_constraintEnd_toEndOf="@id/textName"
app:layout_constraintStart_toStartOf="@id/textName"
app:layout_constraintTop_toBottomOf="@id/textCreatedBy"/>

<ImageView
android:id="@+id/imageSelected"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginEnd="20dp"
android:contentDescription="@string/app_name"
android:src="@drawable/checkmark"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@id/viewBackground"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/viewBackground"/>

</androidx.constraintlayout.widget.ConstraintLayout>


Sekarang kita beralih pada koding java. Ada 4 java class yang kita gunakan dalam contoh ini yakni : tentunya class activity (MainActivity.java), class adapter (TvShowsAdapter), class untuk menyetel nilai-nilai object View yang ada pada item RecyclerView (TvShow.java), dan interface sebagai listener item dipilih atau tidak pada RecyclerView (TvShowsListener.java).

Kita mulai dari TvShowsListener.java. Interface ini hanya berisi sebuah metode void dengan Boolean sebagai argumennya. Interface ini untuk menyetel visibility dari komponen Button yang ada di activity_main.xml. Saat Anda membuat file ini, pilih interface pada pilihan yang tersedia, atau bisa juga tidak, lalu salin kode dibawah ini maka class secara otomatis menjadi interface. Berikut isinya :

TvShowsListener.java :
package com.gwnbs.rvmultiple;

interface TvShowsListener {
void onTvShowAction (Boolean isSelected);
}


Berikutnya file TvShow.java yang fungsinya sudah dijelaskan diatas. Dalam file ini terdapat 3 variabel dari object String untuk menyetel nilai string TextView nama, TextView pembuat, dan TextView cuplikan cerita. Kemudian sebuah int untuk menyetel Gambar poster. Sebuah Boolean untuk memberi 2 fungsi (dipilih dan tidak dipilih) saat item diklik, dengan nilai default false. Terakhir sebuah float untuk menyetel nilai rating. Berikut isinya :

TvShow.java :
package com.gwnbs.rvmultiple;

public class TvShow {
String name, createdBy, story;
int image;
Boolean isSelected = false;
float rating;
}


Selanjutnya class TvShowsAdapter.java. Sebagaimana mestinya fungsi adapter, di class ini kita menghubungkan layout item_rv_tvshows.xml dengan RecyclerView. Untuk metode klik listener item dipilih dan tidak dipilih kita aplikasikan pada ConstrainLayout yang ada di item_rv_tvshows.xml, dan Boolean yang ada pada TvShow.java sebelumnya memberikan 2 fungsi kepada metode klik listener ini. Berikut isi selengkapnya :

TvShowsAdapter.java :
package com.gwnbs.rvmultiple;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.RecyclerView;

import com.makeramen.roundedimageview.RoundedImageView;

import java.util.ArrayList;
import java.util.List;

public class TvShowsAdapter extends RecyclerView.Adapter<TvShowsAdapter.TvShowViewHolder> {

private List<TvShow> tvShows;
private TvShowsListener tvShowsListener;

public TvShowsAdapter(List<TvShow> tvShows, TvShowsListener tvShowsListener) {
this.tvShows = tvShows;
this.tvShowsListener = tvShowsListener;
}

@NonNull
@Override
public TvShowViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new TvShowViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_rv_tvshows,
parent, false));
}

@Override
public void onBindViewHolder(@NonNull TvShowViewHolder holder, int position) {
holder.bindTvShow(tvShows.get(position));
}

@Override
public int getItemCount() {
return tvShows.size();
}

public List<TvShow> getSelectedTvShows () {
List<TvShow> selectedTvShows = new ArrayList<>();
for (TvShow tvShow : tvShows) {
if (tvShow.isSelected) {
selectedTvShows.add(tvShow);
}
}
return selectedTvShows;
}

class TvShowViewHolder extends RecyclerView.ViewHolder {
ConstraintLayout layoutTvshow;
View viewBackground;
RoundedImageView imageTvshow;
TextView textName, textCreatedBy, textStory;
RatingBar ratingBar;
ImageView imageSelected;

TvShowViewHolder(@NonNull View itemView) {
super(itemView);
layoutTvshow = itemView.findViewById(R.id.layoutTvshow);
viewBackground = itemView.findViewById(R.id.viewBackground);
imageTvshow = itemView.findViewById(R.id.imageTvshow);
textName = itemView.findViewById(R.id.textName);
textCreatedBy = itemView.findViewById(R.id.textCreatedBy);
textStory = itemView.findViewById(R.id.textStory);
ratingBar = itemView.findViewById(R.id.ratingBar);
imageSelected = itemView.findViewById(R.id.imageSelected);
}

void bindTvShow(final TvShow tvShow) {
imageTvshow.setImageResource(tvShow.image);
textName.setText(tvShow.name);
textCreatedBy.setText(tvShow.createdBy);
textStory.setText(tvShow.story);
ratingBar.setRating(tvShow.rating);
if (tvShow.isSelected) {
viewBackground.setBackgroundResource(R.drawable.tvshow_selected_bg);
imageSelected.setVisibility(View.VISIBLE);
} else {
viewBackground.setBackgroundResource(R.drawable.tvshow_bg);
imageSelected.setVisibility(View.GONE);
}

layoutTvshow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (tvShow.isSelected) {
viewBackground.setBackgroundResource(R.drawable.tvshow_bg);
imageSelected.setVisibility(View.GONE);
tvShow.isSelected = false;
if (getSelectedTvShows().size() == 0) {
tvShowsListener.onTvShowAction(false);
}
} else {
viewBackground.setBackgroundResource(R.drawable.tvshow_selected_bg);
imageSelected.setVisibility(View.VISIBLE);
tvShow.isSelected = true;
tvShowsListener.onTvShowAction(true);
}
}
});
}
}
}


Terakhir MainActivity.java, class ini kita buat mengimplementasi interface TvShowListener tadi supaya dapat mengatur visibility dari Button Add to Watchlist. Saat ada satu atau lebih item yang dipilih, visibility dari Button ini kita perlihatkan. Saat tidak ada item dipilih, visibility kita hilangkan.

Untuk metode klik listener Button Add to Watchlist, akan menampilkan pesan toast dengan isinya nama dari program TV shows. Nilai-nilai string untuk TextView nama, TextView pembuat, TextView cuplikan cerita, source gambar, dan float rating kita tentukan di dalam class ini.

MainActivity.java :
package com.gwnbs.rvmultiple;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements TvShowsListener {

private Button btnAddWatchlist;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

RecyclerView tvShowsRv = findViewById(R.id.tvShowsRv);
btnAddWatchlist = findViewById(R.id.btnAddWatchlist);

List<TvShow> tvShows = new ArrayList<>();

TvShow gameOfThrones = new TvShow();
gameOfThrones.image = R.drawable.tv_game_of_thones;
gameOfThrones.name = "Game of Thrones";
gameOfThrones.rating = 4.7f;
gameOfThrones.createdBy = "David Benioff, D.B. Weiss";
gameOfThrones.story = "Nine noble families fight for control over the lands of Westeros, while an ancient enemy returns after being dormant for millennia.";
tvShows.add(gameOfThrones);

TvShow superGirl = new TvShow();
superGirl.image = R.drawable.tv_supergirl;
superGirl.name = "Supergirl";
superGirl.rating = 4.1f;
superGirl.createdBy = "Ali Adler, Greg Berlanti, Andrew Kreisberg";
superGirl.story = "The adventures of Superman's cousin in her own superhero career.";
tvShows.add(superGirl);

TvShow theFlash = new TvShow();
theFlash.image = R.drawable.tv_the_flash;
theFlash.name = "The Flash";
theFlash.rating = 4.0f;
theFlash.createdBy = "Greg Berlanti, Geoff Johns, Andrew Kreisberg";
theFlash.story = "After being struck by lightning, Barry Allen wakes up from his coma to discover he's been given the power of super speed, " +
"becoming the next Flash, fighting crime in Central City.";
tvShows.add(theFlash);

TvShow spartacus = new TvShow();
spartacus.image = R.drawable.tv_spartacus;
spartacus.name = "Spartacus";
spartacus.rating = 4.4f;
spartacus.createdBy = "Steven S. DeKnight";
spartacus.story = "The life of Spartacus, the gladiator who lead a rebellion against the Romans. From his time as an ally of the Romans, " +
"to his betrayal and becoming a gladiator, to the rebellion he leads and its ultimate outcome.";
tvShows.add(spartacus);

TvShow vikings = new TvShow();
vikings.image = R.drawable.tv_vikings;
vikings.name = "Vikings";
vikings.rating = 4.5f;
vikings.createdBy = "Michael Hirst";
vikings.story = "Vikings transports us to the brutal and mysterious world of Ragnar Lothbrok, " +
"a Viking warrior and farmer who yearns to explore - and raid - the distant shores across the ocean.";
tvShows.add(vikings);

TvShow carnivalRow = new TvShow();
carnivalRow.image = R.drawable.tv_carnival_row;
carnivalRow.name = "Carnival Row";
carnivalRow.rating = 3.9f;
carnivalRow.createdBy = "Travis Beacham, René Echevarria";
carnivalRow.story = "A human detective and a fairy rekindle a dangerous affair in a Victorian fantasy world, " +
"where the city's uneasy peace collapses when a string of murders reveals an unimaginable monster.";
tvShows.add(carnivalRow);

TvShow theWalkingDead = new TvShow();
theWalkingDead.image = R.drawable.tv_the_walking_dead;
theWalkingDead.name = "The Walking Dead";
theWalkingDead.rating = 4.2f;
theWalkingDead.createdBy = "Frank Darabont, Angela Kang";
theWalkingDead.story = "Sheriff Deputy Rick Grimes wakes up from a coma to learn the world is in ruins and must lead a group of survivors to stay alive.";
tvShows.add(theWalkingDead);

TvShow theLastKingdom = new TvShow();
theLastKingdom.image = R.drawable.tv_the_last_kingdom;
theLastKingdom.name = "The Last Kingdom";
theLastKingdom.rating = 4.6f;
theLastKingdom.createdBy = "Bernard Cornwell";
theLastKingdom.story = "As Alfred the Great defends his kingdom from Norse invaders, Uhtred - born a Saxon but raised by Vikings - seeks to claim his ancestral birthright.";
tvShows.add(theLastKingdom);

final TvShowsAdapter tvShowsAdapter = new TvShowsAdapter(tvShows, this);
tvShowsRv.setAdapter(tvShowsAdapter);

btnAddWatchlist.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<TvShow> selectedTvShows = tvShowsAdapter.getSelectedTvShows();
StringBuilder tvShowNames = new StringBuilder();
for (int i = 0; i < selectedTvShows.size(); i++) {
if (i == 0) {
tvShowNames.append(selectedTvShows.get(i).name);
} else {
tvShowNames.append("\n").append(selectedTvShows.get(i).name);
}
}
Toast toast = Toast.makeText(getApplicationContext(), tvShowNames.toString(), Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
});
}

@Override
public void onTvShowAction(Boolean isSelected) {
if (isSelected) {
btnAddWatchlist.setVisibility(View.VISIBLE);
} else {
btnAddWatchlist.setVisibility(View.GONE);
}
}
}


Demikian tutorial ini. Terima kasih untuk kunjungan dan waktunya. Jika ada pertanyaan silahkan di sampaikan di kolom komentar.
Share:

0 comments:

Post a Comment

Hubungi Saya

Name

Email *

Message *

Terlaris 30 Hari Terakhir