diff options
author | Clyhtsuriva <aimeric@adjutor.xyz> | 2021-03-23 10:38:03 +0100 |
---|---|---|
committer | Clyhtsuriva <aimeric@adjutor.xyz> | 2021-03-23 10:38:03 +0100 |
commit | d283df0f70241bb6b54bee66e8fb9564b0051376 (patch) | |
tree | 374a9a97fc1ad7caa3766b4bac45f517631444cd | |
parent | 436a01b64a3c2500aa8801a72f95dfc40b0b33b7 (diff) |
Feature added to mangas
Display other pages by touching the bottom or by clicking buttons
-rw-r--r-- | README.md | 4 | ||||
-rw-r--r-- | app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt | 5 | ||||
-rw-r--r-- | app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaPage.kt | 48 | ||||
-rw-r--r-- | app/src/main/res/layout/top_manga_page.xml | 16 | ||||
-rw-r--r-- | app/src/main/res/values/strings.xml | 2 |
5 files changed, 68 insertions, 7 deletions
@@ -1,5 +1,7 @@ List of elements used in top manga and top anime with a recycler view -SwipeRefresh used to refresh the list of data. +SwipeRefresh used to refresh the list of data of the frist page. +Thanks to the scroll listener, touch the bottom of the page to load another page, replacing the first one. +Use the button (prev and next) to navigate with ease through the pages. The "ScrollListener" was added as a practice, it's not the best feature to navigate. Details of a chosen element from the recycler view with an intent object Title, synopsys and background clickable. diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt index 629fe02..2688fab 100644 --- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt +++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt @@ -2,10 +2,11 @@ package xyz.adjutor.aniki.manga.topmanga import retrofit2.Call import retrofit2.http.GET +import retrofit2.http.Path interface TopMangaApi { - @GET("v3/top/manga") - fun getTopMangaData(): Call<TopMangaResponse> + @GET("v3/top/manga/{page}") + fun getTopMangaData(@Path("page") page: Int): Call<TopMangaResponse> }
\ No newline at end of file diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaPage.kt index b35bcdd..ea240b9 100644 --- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaPage.kt +++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaPage.kt @@ -24,6 +24,7 @@ import retrofit2.converter.gson.GsonConverterFactory import xyz.adjutor.aniki.R import java.lang.reflect.Type + class TopMangaPage : Fragment() { private lateinit var sharedPreferences: SharedPreferences @@ -31,6 +32,7 @@ class TopMangaPage : Fragment() { .setLenient() .create() private var baseUrl = "https://api.jikan.moe/" //the api's base url + var page: Int = 1 override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -45,10 +47,29 @@ class TopMangaPage : Fragment() { if (mangaList != null) { showList(view, mangaList) } else { - makeApiCall(view, baseUrl) + makeApiCall(view, baseUrl, 1) } + // add other pages when we touch the bottom + val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view) + recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + super.onScrollStateChanged(recyclerView, newState) + if (!recyclerView.canScrollVertically(1)) { //direction integers: -1 for up, 1 for down, 0 will always return false. + page += 1 + makeApiCall(view, baseUrl, page) + Snackbar.make( + requireView(), + "Page $page has been loaded.", + Snackbar.LENGTH_LONG + ) + .setAction("Action", null).show() + } + } + }) + return view + } private fun getDataFromCache(): List<TopManga>? { @@ -71,16 +92,35 @@ class TopMangaPage : Fragment() { view.findViewById<Button>(R.id.button_home).setOnClickListener { findNavController().navigate(R.id.action_TopMangaPage_to_HomePage) } + view.findViewById<Button>(R.id.button_prev).setOnClickListener { + if (page > 1) { + page -= 1 + makeApiCall(view, baseUrl, page) + Snackbar.make(requireView(), "Page $page has been loaded.", Snackbar.LENGTH_LONG) + .setAction("Action", null).show() + } else { + Snackbar.make(requireView(), "You're already page 1.", Snackbar.LENGTH_LONG) + .setAction("Action", null).show() + } + } + view.findViewById<Button>(R.id.button_next).setOnClickListener { + page += 1 + makeApiCall(view, baseUrl, page) + Snackbar.make(requireView(), "Page $page has been loaded.", Snackbar.LENGTH_LONG) + .setAction("Action", null).show() + } fun updateList() { - makeApiCall(view, baseUrl) + makeApiCall(view, baseUrl, 1) Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } + //refresh when swiping down at the top of the page val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh) swipeRefresh.setOnRefreshListener { updateList() + page = 1 swipeRefresh.isRefreshing = false } @@ -95,7 +135,7 @@ class TopMangaPage : Fragment() { (recyclerView.adapter as TopMangaAdapter).notifyDataSetChanged() } - private fun makeApiCall(view: View, BASE_URL: String) { + private fun makeApiCall(view: View, BASE_URL: String, page: Int) { val retrofit = Retrofit.Builder() .baseUrl(BASE_URL) @@ -103,7 +143,7 @@ class TopMangaPage : Fragment() { .build() val service = retrofit.create(TopMangaApi::class.java) - val call = service.getTopMangaData() + val call = service.getTopMangaData(page) call.enqueue(object : Callback<TopMangaResponse> { override fun onResponse( diff --git a/app/src/main/res/layout/top_manga_page.xml b/app/src/main/res/layout/top_manga_page.xml index f3d0db3..2f4a9f1 100644 --- a/app/src/main/res/layout/top_manga_page.xml +++ b/app/src/main/res/layout/top_manga_page.xml @@ -25,6 +25,14 @@ </androidx.swiperefreshlayout.widget.SwipeRefreshLayout> <Button + android:id="@+id/button_prev" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/prev" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@id/button_home" /> + + <Button android:id="@+id/button_home" android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -33,4 +41,12 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> + <Button + android:id="@+id/button_next" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/next" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toEndOf="@id/button_home" /> + </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0c56edc..861a440 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,5 +42,7 @@ <string name="search_anime">Search Anime</string> <string name="search_anime_page_label">Search Anime Page</string> <string name="hint_query">Your query …</string> + <string name="prev">PREV</string> + <string name="next">NEXT</string> </resources>
\ No newline at end of file |