From 0fc1d8b5c2e3198e65aa47e2302034eb7d1eff14 Mon Sep 17 00:00:00 2001 From: Jannik Date: Mon, 12 Oct 2020 09:54:32 +0200 Subject: [PATCH] use recyclerview for episodes in media fragment closes #3 --- app/build.gradle | 1 + .../java/org/mosad/teapod/ui/MediaFragment.kt | 24 +++- .../java/org/mosad/teapod/util/DataTypes.kt | 1 + .../org/mosad/teapod/util/EpisodesAdapter.kt | 35 +++++ app/src/main/res/layout/component_episode.xml | 40 ++++++ app/src/main/res/layout/fragment_media.xml | 134 +++++++++--------- 6 files changed, 162 insertions(+), 73 deletions(-) create mode 100644 app/src/main/java/org/mosad/teapod/util/EpisodesAdapter.kt create mode 100644 app/src/main/res/layout/component_episode.xml diff --git a/app/build.gradle b/app/build.gradle index 6051734..26b29f6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -58,6 +58,7 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.11.0' implementation 'com.afollestad.material-dialogs:core:3.3.0' implementation 'com.afollestad.material-dialogs:bottomsheets:3.3.0' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.2' diff --git a/app/src/main/java/org/mosad/teapod/ui/MediaFragment.kt b/app/src/main/java/org/mosad/teapod/ui/MediaFragment.kt index dd91182..561227c 100644 --- a/app/src/main/java/org/mosad/teapod/ui/MediaFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/MediaFragment.kt @@ -6,18 +6,22 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.ArrayAdapter +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import kotlinx.android.synthetic.main.fragment_media.* import org.mosad.teapod.MainActivity import org.mosad.teapod.R import org.mosad.teapod.util.DataTypes.MediaType +import org.mosad.teapod.util.EpisodesAdapter import org.mosad.teapod.util.GUIMedia import org.mosad.teapod.util.StreamMedia class MediaFragment(private val guiMedia: GUIMedia, private val streamMedia: StreamMedia) : Fragment() { - private lateinit var adapterEpisodes: ArrayAdapter + private lateinit var adapterRecEpisodes: EpisodesAdapter + private lateinit var viewManager: RecyclerView.LayoutManager + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_media, container, false) @@ -37,11 +41,14 @@ class MediaFragment(private val guiMedia: GUIMedia, private val streamMedia: Str "${guiMedia.title} - Ep. ${index + 1}" } - adapterEpisodes = ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, episodes) - list_episodes.adapter = adapterEpisodes + + adapterRecEpisodes = EpisodesAdapter(episodes) + viewManager = LinearLayoutManager(context) + recycler_episodes.layoutManager = viewManager + recycler_episodes.adapter = adapterRecEpisodes } else if (streamMedia.type == MediaType.MOVIE) { - list_episodes.visibility = View.GONE + recycler_episodes.visibility = View.GONE } @@ -55,8 +62,11 @@ class MediaFragment(private val guiMedia: GUIMedia, private val streamMedia: Str onClickButtonPlay() } - list_episodes.setOnItemClickListener { _, _, position, _ -> - playStream(streamMedia.streams[position]) + // set onItemClick only in adapter is initialized + if (this::adapterRecEpisodes.isInitialized) { + adapterRecEpisodes.onItemClick = { item, position -> + playStream(streamMedia.streams[position]) + } } } diff --git a/app/src/main/java/org/mosad/teapod/util/DataTypes.kt b/app/src/main/java/org/mosad/teapod/util/DataTypes.kt index 677b004..3dcdc2d 100644 --- a/app/src/main/java/org/mosad/teapod/util/DataTypes.kt +++ b/app/src/main/java/org/mosad/teapod/util/DataTypes.kt @@ -8,6 +8,7 @@ class DataTypes { } } +// TODO rework: add type, episodes list with episode title, if type == MOVIE the first episode will be the movie stream data class GUIMedia(val title: String, val posterLink: String, val shortDesc : String, val link: String) { override fun toString(): String { return title diff --git a/app/src/main/java/org/mosad/teapod/util/EpisodesAdapter.kt b/app/src/main/java/org/mosad/teapod/util/EpisodesAdapter.kt new file mode 100644 index 0000000..347017b --- /dev/null +++ b/app/src/main/java/org/mosad/teapod/util/EpisodesAdapter.kt @@ -0,0 +1,35 @@ +package org.mosad.teapod.util + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import kotlinx.android.synthetic.main.component_episode.view.* +import org.mosad.teapod.R + +class EpisodesAdapter(private val data: List) : RecyclerView.Adapter() { + + var onItemClick: ((String, Int) -> Unit)? = null + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.component_episode, parent, false) + + return MyViewHolder(view) + } + + override fun onBindViewHolder(holder: MyViewHolder, position: Int) { + holder.view .text_episode_title.text = data[position] + } + + override fun getItemCount(): Int { + return data.size + } + + inner class MyViewHolder(val view: View) : RecyclerView.ViewHolder(view) { + init { + view.setOnClickListener { + onItemClick?.invoke(data[adapterPosition], adapterPosition) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/component_episode.xml b/app/src/main/res/layout/component_episode.xml new file mode 100644 index 0000000..06d2bb8 --- /dev/null +++ b/app/src/main/res/layout/component_episode.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_media.xml b/app/src/main/res/layout/fragment_media.xml index aac6c25..2356aa3 100644 --- a/app/src/main/res/layout/fragment_media.xml +++ b/app/src/main/res/layout/fragment_media.xml @@ -7,73 +7,75 @@ android:background="#f5f5f5" tools:context=".ui.MediaFragment"> - + android:layout_height="match_parent" + android:fillViewport="true"> - - -