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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.net.URL | |
class ApiRepository { | |
fun doRequest(url: String): String { | |
return URL(url).readText() | |
} | |
} |
Kelas Object TheSportDbApi.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} | |
} |
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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> |
xml nya seperti ini
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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> |
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package id.co.metrasat.footballApp.model | |
import com.google.gson.annotations.SerializedName | |
data class EventsResponse( | |
@SerializedName("events") | |
val Events: List<EventsItem> | |
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
interface MainView { | |
fun showLoading() | |
fun hideLoading() | |
fun showEventList(data:List<EventsItem>) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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,
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | |
} |
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
Reviewed by nur
on
September 26, 2018
Rating:

No comments: