Tutorial KOTLIN : Parsing data from API in Kotlin

Hey Yow,
Postingan kali ini saya akan membuat tutorial bagaimana menampilkan list data di Recyclerview dari API thesportdb menggunakan kotlin, seperti yang kita tahu bahwa banyak sekali resource yang tersebar di internet yang memberikan akses untuk membantu developer melalukan parsing menggunakan library seperti Retrofit, Volley atau yang lainnya. Di Kotlin sendiri menyediakan beberapa exctensions fucntion yang bisa menyederhanakan suatu fungsi salah satunya readText yang bisa diguankan untuk request data dari API.






TheSportDb merupakan basis data sumber terbuka dari metadata Olahraga dengan acara, daftar tv, karya seni, skor, dan API gratis. Untuk dokumentasi API selanjutnya bisa di akses di halaman ini. sebagai contoh response dari API untuk menampilkan Next Event League


1. First of all, create new project jangan lupa centang checkbox "Include Kotlin Support" untuk lengkapnya kalian bisa liat tutorial sebelumnya di sini  
buat kelas baru dan beri nama ApiRepository yang berisi functions readText seperti berikut ini, lalu buat kelas object yang menampung API dari sportDb, sebelumnya jangan lupa tambahkan  buildConfigField pada defaultConfig di kelas Build.Gradle untuk menyimpan BASE_URL dan API_KEY

Kelas ApiRepository.kt
import java.net.URL
class ApiRepository {
fun doRequest(url: String): String {
return URL(url).readText()
}
}
Kelas Object TheSportDbApi.kt
import id.co.metrasat.footballApp.BuildConfig
object TheSportDBApi {
fun getEventNext(league: String?): String {
return "${BuildConfig.BASE_URL}api/v1/json/${BuildConfig.TSDB_API_KEY}/eventsnextleague.php?id=" + league
}
}
Setting buildConfigField di gradle


2. Next,  Design User Interface, Jika biasanya ketika membuat tampilan aplikasi android menggunakan XML, di kotlin kita bisa menggunakan Anko Layout, sebuah extention tambahan untuk membuat layout aplikasi secara aman dan dinamis, tapi kali ini kita masih menggunakan cara lama yaitu XML, lain kali saya akan membuat tutorial tentang Anko Layout,
Ok Lanjut, jangan lupa tambahkan dependencies untuk recycler view dan card view, lalu modifikasi tampilan kalian seperti xml dibawah ini

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".fragment.FragmentEventNext">
<ProgressBar
android:id="@+id/pgBarNext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="invisible" />
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipeEventNext"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:id="@+id/rvEventNext"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>
lalu, bikin card_list.xml untuk membuat layout card recyclerview, seperti ini

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.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:id="@+id/cardList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:padding="5dp"
app:cardCornerRadius="1dp"
app:cardElevation="5dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/txt_dateEvent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingTop="10dp"
tools:text="Minggu, 02 Juli 2018" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
<TextView
android:id="@+id/strHomeTeam"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:paddingRight="10dp"
android:textSize="15sp"
tools:text="Man United" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="horizontal">
<TextView
android:id="@+id/strHomeScore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="5dp"
android:textSize="18sp"
android:textStyle="bold"
tools:text="2" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:paddingRight="10dp"
android:text="@string/vs"
android:textColor="@color/dark_green"
android:textSize="20sp" />
<TextView
android:id="@+id/strAwayScore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="5dp"
android:textSize="18sp"
android:textStyle="bold"
tools:text="2" />
</LinearLayout>
<TextView
android:id="@+id/strAwayTeam"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:textSize="15sp"
tools:text="Tottenham" />
</RelativeLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
view raw card_list.xml hosted with ❤ by GitHub
terakhir, tampilan untuk detail_activity.xml yang akan menampilkan detail dari cardview ketika di klik,
xml nya seperti ini
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/pg_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="visible" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="5dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="vertical"
android:padding="5dp">
<ImageView
android:id="@+id/img_home"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center"
android:paddingBottom="10dp"
android:paddingTop="10dp" />
<TextView
android:id="@+id/txt_home_name_club"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="15sp" />
<TextView
android:id="@+id/txt_home_formation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/vs" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="5dp">
<ImageView
android:id="@+id/img_away"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center"
android:paddingBottom="10dp"
android:paddingTop="10dp" />
<TextView
android:id="@+id/txt_away_name_club"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="15sp" />
<TextView
android:id="@+id/txt_away_formation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardElevation="5dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="5dp"
android:orientation="vertical"
android:padding="10dp">
<LinearLayout
android:id="@+id/lnr_goals"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="10dp"
android:orientation="horizontal">
<TextView
android:id="@+id/txt_home_goals"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="@string/goals"
android:textColor="@color/background" />
<TextView
android:id="@+id/txt_away_goals"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end" />
</LinearLayout>
<LinearLayout
android:id="@+id/lnr_shots"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="10dp"
android:orientation="horizontal">
<TextView
android:id="@+id/txt_home_shots"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="@string/shots"
android:textColor="@color/background" />
<TextView
android:id="@+id/txt_away_shots"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end" />
</LinearLayout>
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="1">
<TableRow
android:background="@drawable/background_square"
android:gravity="center">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:padding="5dip"
android:text="@string/lineups" />
</TableRow>
</TableLayout>
<LinearLayout
android:id="@+id/lnr_defense"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:orientation="horizontal">
<TextView
android:id="@+id/txt_home_defense"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="@string/defense"
android:textColor="@color/background" />
<TextView
android:id="@+id/txt_away_defense"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end" />
</LinearLayout>
<LinearLayout
android:id="@+id/lnr_midfield"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:orientation="horizontal">
<TextView
android:id="@+id/txt_home_midfield"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="@string/midfield"
android:textColor="@color/background" />
<TextView
android:id="@+id/txt_away_midfield"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end" />
</LinearLayout>
<LinearLayout
android:id="@+id/lnr_forward"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:orientation="horizontal">
<TextView
android:id="@+id/txt_home_forward"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="@string/forward"
android:textColor="@color/background" />
<TextView
android:id="@+id/txt_away_forward"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:orientation="horizontal">
<TextView
android:id="@+id/txt_home_substitutes"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="@string/substitutes"
android:textColor="@color/background" />
<TextView
android:id="@+id/txt_away_subtitutes"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end" />
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
</RelativeLayout>
</ScrollView>
Untuk selebihnya, kalian bisa melakukan modifkasi tampilan, warna, atau tema yang digunakan sesuai dengan kreatifitas masing - masing.

3. Lanjut, buatlah 2 data class yang berisi object yang dibutuhkan untuk menampung response dari API, untuk melihat responsenya kalian bisa menggunakan PostMan atau plugin lainnya, di Android studio sendiri menyediakan plugin yang bisa mngconvert file Json ke file Skema POJO, kalian bisa mendowlond plugin yang telah di sediakan yaitu RoboPOJOGenerator
caranya Plih File  - Setting - Plugin - lalu pilih Browse Repositories, pada menu Search bar cari RoboPojoGenerator lalu pilih install (karena AS saya sudah ke-install plugin jadi tidak ada tombol installnya :p ) setelah berhasil install lalu OK, dan restart Android Studio Kalian


untuk cara menggunakannya, setelah kalian mendapatkan Response API di Postman copy file Jsonnya , buka android studio lalu klik kanan di salah satu folder java - New - Generate POJO from Json lalu copy paste di console yang berlatar hitam, centang checkbox Kotlin dan Gson lalu pilih Generate


Akhirnya, kita akan memiliki 2 data class yang berisi object dari API eventnextleague.php yaitu EventItem dan EventResponse, maka seperti ini penampakannya

data class EventItem
package id.co.metrasat.footballApp.model
import com.google.gson.annotations.SerializedName
data class EventsItem(
@SerializedName("idEvent")
var idEvent: String?=null,
@SerializedName("idLeague")
val idLeague: String?=null,
@SerializedName("idAwayTeam")
var idAwayTeam: String?=null,
@SerializedName("intHomeScore")
val intHomeScore: String?=null,
@SerializedName("idHomeTeam")
var idHomeTeam: String?=null,
@SerializedName("intAwayScore")
val intAwayScore: String?=null,
@SerializedName("dateEvent")
val dateEvent: String?=null,
@SerializedName("strAwayTeam")
val strAwayTeam: String?=null,
@SerializedName("strHomeTeam")
val strHomeTeam: String?=null,
@SerializedName("strHomeLineupDefense")
val strHomeLineupDefense: String?=null,
@SerializedName("strAwayLineupDefense")
val strAwayLineupDefense: String?=null,
@SerializedName("strHomeLineupForward")
val strHomeLineupForward: String?=null,
@SerializedName("strHomeLineupSubstitutes")
val strHomeLineupSubtitutes: String?=null,
@SerializedName("strAwayLineupForward")
val strAwayLineupForward: String?=null,
@SerializedName("strAwayLineupSubstitutes")
val strAwayLineupSubtitutes: String?=null,
@SerializedName("strAwayLineupMidfield")
val strAwayLineupMidfield: String?=null,
@SerializedName("strHomeLineupMidfield")
val strHomeLineupMidfield: String?=null,
@SerializedName("strHomeGoalDetails")
val strHomeGoalDetails: String?=null,
@SerializedName("strAwayGoalDetails")
val strAwayGoalsDetails: String?=null,
@SerializedName("strAwayFormation")
val strAwayFormation: String?=null,
@SerializedName("strHomeFormation")
val strHomeFormation: String? = null
)
view raw EventItem.kt hosted with ❤ by GitHub
data class EventResponse.kt
package id.co.metrasat.footballApp.model
import com.google.gson.annotations.SerializedName
data class EventsResponse(
@SerializedName("events")
val Events: List<EventsItem>
)
view raw EventResonse.kt hosted with ❤ by GitHub
4. The last but not the least,  setelah sebelumnya kita telah membuat 2 data kelas object, selanjutnya kita akan membuat kelas interface untuk mengatur view serta kelas presenter sebagai jembatan antara data class model dengan view. So, bikin kelas baru dan beri nama Main View yang berisi interface untuk mengatur visibility dari ProgressBar, sourcenya seperti ini  :

interface MainView {
fun showLoading()
fun hideLoading()
fun showEventList(data:List<EventsItem>)
}
view raw MainView.kt hosted with ❤ by GitHub
selanjutnya bikin kelas MainPresenter, berisi constructor dan behaviour seperti ini :
class MainPresenter(private val view: MainView,
private val apiRepository: ApiRepository,
private val gson: Gson) {
fun getEventNext(leagueId: String?) {
view.showLoading()
doAsync {
val data = gson.fromJson(apiRepository.doRequest(TheSportDBApi.getEventNext(leagueId)),
EventsResponse::class.java
)
uiThread{
view.hideLoading()
view.showEventList(data.Events)
}
}
}

5. Last? not really, Sudah hampir selesai nih, selanjutnya, membuat kelas adapter untuk menampilkan list data pada Recyclerview, 
import android.content.Context
import android.os.Build
import android.support.annotation.RequiresApi
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import id.co.metrasat.footballApp.DetailClub
import id.co.metrasat.footballApp.R
import id.co.metrasat.footballApp.model.EventsItem
import org.jetbrains.anko.startActivity
import java.text.SimpleDateFormat
import java.util.*
class EventsAdapter(private val context: Context?, private val events: List<EventsItem>)
: RecyclerView.Adapter<EventsAdapter.EventHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
EventHolder(LayoutInflater.from(context).inflate(R.layout.card_list, parent, false))
override fun getItemCount(): Int = events.size
@RequiresApi(Build.VERSION_CODES.O)
override fun onBindViewHolder(holder: EventHolder, position: Int) {
holder.bindItem(events [position])
holder.itemView.setOnClickListener {
context?.startActivity<DetailClub>(
DetailClub.ID_EVENTS to events[position].idEvent,
DetailClub.ID_HOME to events[position].idHomeTeam,
DetailClub.HOME_NAME to events[position].strHomeTeam,
DetailClub.ID_AWAY to events[position].idAwayTeam,
DetailClub.AWAY_NAME to events[position].strAwayTeam)
}
}
class EventHolder(view:View) :RecyclerView.ViewHolder(view) {
private val dateEvents = view.findViewById<TextView>(R.id.txt_dateEvent)
private val strAway = view.findViewById<TextView>(R.id.strAwayTeam)
private val strHome = view.findViewById<TextView>(R.id.strHomeTeam)
private val homeScore = view.findViewById<TextView>(R.id.strHomeScore)
private val awayScore = view.findViewById<TextView>(R.id.strAwayScore)
@RequiresApi(Build.VERSION_CODES.O)
fun bindItem (events: EventsItem){
val formatDate = SimpleDateFormat("yyy-MM-dd", Locale.getDefault())
val date = formatDate.parse(events.dateEvent)
val dateText = SimpleDateFormat("EEEE, dd-MM-yyyy", Locale.getDefault())
.format(date).toString()
dateEvents.text = dateText
strAway.text = events.strAwayTeam
strHome.text = events.strHomeTeam
homeScore.text = events.intHomeScore
awayScore.text = events.intAwayScore
}
}
}

pada kelas MainActivity.kt modifikasi codingannya menjadi seperti di bawah ini

class MainActivity : Fragment(), MainView {
private var eventsNext: MutableList<EventsItem> = mutableListOf()
private lateinit var presenter: MainPresenter
private lateinit var mAdapter: EventsAdapter
private lateinit var progressBar: ProgressBar
private lateinit var swipeRefresh: SwipeRefreshLayout
private lateinit var recyclerViewEvent: RecyclerView
override fun onCreate (savedInstanceState: Bundle?): View? {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
progressBar = findViewById(R.id.pgBarNext)
swipeRefresh =findViewById(R.id.swipeEventNext)
recyclerViewEvent = findViewById(R.id.rvEventNext)
val layoutManager: RecyclerView.LayoutManager = GridLayoutManager(context, 1)
recyclerViewEvent.layoutManager = layoutManager
mAdapter = EventsAdapter(this.requireActivity(), eventsNext)
recyclerViewEvent.adapter = mAdapter
val apiRepository = ApiRepository()
val gson = Gson()
presenter = MainPresenter(this, apiRepository, gson)
presenter.getEventNext(MainView.LEAGUE_ID)
}
override fun showLoading() {
progressBar.visible()
}
override fun hideLoading() {
progressBar.invisible()
}
override fun showEventList(data: List<EventsItem>) {
swipeRefresh.isRefreshing = false
eventsNext.clear()
eventsNext.addAll(data)
mAdapter.notifyDataSetChanged()
}
}
view raw MainActivity.kt hosted with ❤ by GitHub
6. Finally, Kalian bisa membuat kelas baru dengan nama DetailClub untuk menampilkan hasil ketika cardview di klik dan menampilkan detail dari data, kurang lebih seperti ini tampilannya

class DetailClub : AppCompatActivity(), MainView {
var idEvent: String = ""
var idAway: String = ""
var idHome: String = ""
var nameHome: String = ""
var nameAway: String = ""
private lateinit var progressBar: ProgressBar
private lateinit var presenter: EventDetailsPresenter
private lateinit var events: EventsItem
companion object {
const val ID_EVENTS = "id_events"
const val ID_AWAY = "id_Away"
const val ID_HOME = "id_Home"
const val HOME_NAME = "home_name"
const val AWAY_NAME = "away_name"
}
@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.detail_activity)
progressBar = findViewById(R.id.pg_bar)
val intent = intent
idEvent = intent.getStringExtra(ID_EVENTS)
idAway = intent.getStringExtra(ID_AWAY)
idHome = intent.getStringExtra(ID_HOME)
nameAway = intent.getStringExtra(AWAY_NAME)
nameHome = intent.getStringExtra(HOME_NAME)
val request = ApiRepository()
val gson = Gson()
presenter = EventDetailsPresenter(this, request, gson)
presenter.getLookUpEvents(idEvent)
BadgeFetcher().loadLogo(idHome, img_home)
BadgeFetcher().loadLogo(idAway, img_away)
}
override fun showEventList(data: List<EventsItem>) {
events = data[0]
txt_home_name_club.text = nameHome
txt_away_name_club.text = nameAway
txt_home_goals.text = events.strHomeGoalDetails?.replace(";", "\n")
txt_away_goals.text = events.strAwayGoalsDetails?.replace(";", "\n")
if (events.intHomeScore != null) txt_home_shots.text = events.intHomeScore.toString()
if (events.intAwayScore != null) txt_away_shots.text = events.intAwayScore.toString()
txt_home_defense.text = events.strHomeLineupDefense?.replace(";", "\n")
txt_away_defense.text = events.strAwayLineupDefense?.replace(";", "\n")
txt_home_formation.text = events.strHomeFormation?.replace(";", "\n")
txt_away_formation.text = events.strAwayFormation?.replace(";", "\n")
txt_home_midfield.text = events.strHomeLineupMidfield
txt_away_midfield.text = events.strAwayLineupMidfield
txt_away_subtitutes.text = events.strAwayLineupSubtitutes
txt_home_substitutes.text = events.strHomeLineupSubtitutes
txt_away_forward.text = events.strAwayLineupForward
txt_home_forward.text = events.strHomeLineupForward
}
override fun showLoading() {
progressBar.visible()
}
override fun hideLoading() {
progressBar.invisible()
}
view raw DetailClub.kt hosted with ❤ by GitHub
Well itu sedikit tutorial tentang parsing data API di Kotlin, agar aplikasi yang dibuat lebih menarik lagi, kalian bisa membuatnya dengan menambahkan bottom navigation untuk menampilkan data - data yang lain seperti pertandingan selanjutnya atau daftar pemain dari setiap club.
Nah jika ada yang ditanyakan silahkan tulis komentar dibawah, dengan senang hati saya akan membantu kalian, cheers

Tutorial KOTLIN : Parsing data from API in Kotlin Tutorial KOTLIN : Parsing data from API in Kotlin Reviewed by nur on September 26, 2018 Rating: 5

No comments:

Powered by Blogger.