Skip to content

Commit fa7fc42

Browse files
committed
Update MovieListFragment using binding
1 parent c5c7e48 commit fa7fc42

File tree

7 files changed

+53
-64
lines changed

7 files changed

+53
-64
lines changed

app/src/main/java/com/skydoves/themovies2/binding/RecyclerViewBinding.kt

+21
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package com.skydoves.themovies2.binding
1818

1919
import androidx.databinding.BindingAdapter
2020
import androidx.recyclerview.widget.RecyclerView
21+
import com.skydoves.baserecyclerviewadapter.BaseAdapter
22+
import com.skydoves.baserecyclerviewadapter.RecyclerViewPaginator
2123
import com.skydoves.themovies2.extension.visible
2224
import com.skydoves.themovies2.models.Review
2325
import com.skydoves.themovies2.models.Video
@@ -29,9 +31,15 @@ import com.skydoves.themovies2.view.adapter.PeopleAdapter
2931
import com.skydoves.themovies2.view.adapter.ReviewListAdapter
3032
import com.skydoves.themovies2.view.adapter.TvListAdapter
3133
import com.skydoves.themovies2.view.adapter.VideoListAdapter
34+
import com.skydoves.themovies2.view.ui.main.MainActivityViewModel
3235
import com.skydoves.whatif.whatIfNotNull
3336
import com.skydoves.whatif.whatIfNotNullOrEmpty
3437

38+
@BindingAdapter("adapter")
39+
fun bindAdapter(view: RecyclerView, baseAdapter: BaseAdapter) {
40+
view.adapter = baseAdapter
41+
}
42+
3543
@BindingAdapter("adapterMovieList")
3644
fun bindAdapterMovieList(view: RecyclerView, movies: List<Movie>?) {
3745
movies.whatIfNotNull {
@@ -40,6 +48,19 @@ fun bindAdapterMovieList(view: RecyclerView, movies: List<Movie>?) {
4048
}
4149
}
4250

51+
@BindingAdapter("paginationMovieList")
52+
fun paginationMovieList(view: RecyclerView, viewModel: MainActivityViewModel) {
53+
RecyclerViewPaginator(
54+
recyclerView = view,
55+
isLoading = { false },
56+
loadMore = { viewModel.postMoviePage(it) },
57+
onLast = { false }
58+
).run {
59+
threshold = 4
60+
currentPage = 1
61+
}
62+
}
63+
4364
@BindingAdapter("adapterPersonList")
4465
fun bindAdapterPersonList(view: RecyclerView, people: List<Person>?) {
4566
people.whatIfNotNull {

app/src/main/java/com/skydoves/themovies2/binding/ViewBinding.kt

+9
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ import android.annotation.SuppressLint
2020
import android.view.View
2121
import android.widget.ImageView
2222
import android.widget.TextView
23+
import android.widget.Toast
2324
import androidx.databinding.BindingAdapter
25+
import androidx.lifecycle.LiveData
2426
import co.lujun.androidtagview.TagContainerLayout
2527
import com.bumptech.glide.Glide
2628
import com.bumptech.glide.request.RequestOptions
@@ -35,6 +37,13 @@ import com.skydoves.themovies2.models.network.PersonDetail
3537
import com.skydoves.themovies2.room.converters.KeywordListMapper
3638
import com.skydoves.whatif.whatIfNotNull
3739

40+
@BindingAdapter("toast")
41+
fun bindToast(view: View, text: LiveData<String>) {
42+
text.value.whatIfNotNull {
43+
Toast.makeText(view.context, it, Toast.LENGTH_SHORT).show()
44+
}
45+
}
46+
3847
@BindingAdapter("visibilityByResource")
3948
fun bindVisibilityByResource(view: View, anyList: List<Any>?) {
4049
anyList.whatIfNotNull {

app/src/main/java/com/skydoves/themovies2/view/adapter/MovieListAdapter.kt

+2-3
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ import com.skydoves.themovies2.R
2323
import com.skydoves.themovies2.models.entity.Movie
2424
import com.skydoves.themovies2.view.viewholder.MovieListViewHolder
2525

26-
class MovieListAdapter(private val delegate: MovieListViewHolder.Delegate) :
27-
BaseAdapter() {
26+
class MovieListAdapter : BaseAdapter() {
2827

2928
init {
3029
addSection(ArrayList<Movie>())
@@ -38,5 +37,5 @@ class MovieListAdapter(private val delegate: MovieListViewHolder.Delegate) :
3837

3938
override fun layout(sectionRow: SectionRow) = R.layout.item_poster
4039

41-
override fun viewHolder(layout: Int, view: View) = MovieListViewHolder(view, delegate)
40+
override fun viewHolder(layout: Int, view: View) = MovieListViewHolder(view)
4241
}

app/src/main/java/com/skydoves/themovies2/view/ui/main/MainActivityViewModel.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ import com.skydoves.themovies2.repository.DiscoverRepository
2727
import com.skydoves.themovies2.repository.PeopleRepository
2828
import timber.log.Timber
2929

30-
class MainActivityViewModel
31-
constructor(
30+
class MainActivityViewModel constructor(
3231
private val discoverRepository: DiscoverRepository,
3332
private val peopleRepository: PeopleRepository
3433
) : DispatchViewModel() {

app/src/main/java/com/skydoves/themovies2/view/ui/main/MovieListFragment.kt

+7-51
Original file line numberDiff line numberDiff line change
@@ -16,67 +16,23 @@
1616

1717
package com.skydoves.themovies2.view.ui.main
1818

19-
import android.content.Context
2019
import android.os.Bundle
2120
import android.view.LayoutInflater
2221
import android.view.View
2322
import android.view.ViewGroup
24-
import androidx.lifecycle.observe
25-
import androidx.recyclerview.widget.GridLayoutManager
26-
import com.skydoves.baserecyclerviewadapter.RecyclerViewPaginator
2723
import com.skydoves.themovies2.R
2824
import com.skydoves.themovies2.compose.ViewModelFragment
2925
import com.skydoves.themovies2.databinding.MainFragmentMovieBinding
30-
import com.skydoves.themovies2.models.entity.Movie
3126
import com.skydoves.themovies2.view.adapter.MovieListAdapter
32-
import com.skydoves.themovies2.view.ui.details.movie.MovieDetailActivity
33-
import com.skydoves.themovies2.view.viewholder.MovieListViewHolder
34-
import kotlinx.android.synthetic.main.main_fragment_movie.*
35-
import org.jetbrains.anko.support.v4.toast
36-
import org.koin.android.viewmodel.ext.android.viewModel
27+
import org.koin.android.viewmodel.ext.android.getViewModel
3728

38-
class MovieListFragment : ViewModelFragment(), MovieListViewHolder.Delegate {
39-
40-
private val viewModel by viewModel<MainActivityViewModel>()
41-
private lateinit var binding: MainFragmentMovieBinding
29+
class MovieListFragment : ViewModelFragment() {
4230

4331
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
44-
binding = binding(inflater, R.layout.main_fragment_movie, container)
45-
binding.viewModel = viewModel
46-
binding.lifecycleOwner = this
47-
return binding.root
48-
}
49-
50-
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
51-
super.onViewCreated(view, savedInstanceState)
52-
initializeUI()
53-
}
54-
55-
override fun onAttach(context: Context) {
56-
super.onAttach(context)
57-
loadMore(page = 1)
58-
observeMessages()
32+
return binding<MainFragmentMovieBinding>(inflater, R.layout.main_fragment_movie, container).apply {
33+
viewModel = getViewModel<MainActivityViewModel>().apply { postMoviePage(1) }
34+
lifecycleOwner = this@MovieListFragment
35+
adapter = MovieListAdapter()
36+
}.root
5937
}
60-
61-
private fun initializeUI() {
62-
recyclerView.adapter = MovieListAdapter(this)
63-
recyclerView.layoutManager = GridLayoutManager(context, 2)
64-
RecyclerViewPaginator(
65-
recyclerView = recyclerView,
66-
isLoading = { false },
67-
loadMore = { loadMore(it) },
68-
onLast = { false }
69-
).apply {
70-
threshold = 4
71-
currentPage = 1
72-
}
73-
}
74-
75-
private fun loadMore(page: Int) = viewModel.postMoviePage(page)
76-
77-
override fun onItemClick(movie: Movie) =
78-
MovieDetailActivity.startActivityModel(context, movie)
79-
80-
private fun observeMessages() =
81-
this.viewModel.toastLiveData.observe(this) { toast(it) }
8238
}

app/src/main/java/com/skydoves/themovies2/view/viewholder/MovieListViewHolder.kt

+4-8
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,13 @@ import com.github.florent37.glidepalette.GlidePalette
2323
import com.skydoves.baserecyclerviewadapter.BaseViewHolder
2424
import com.skydoves.themovies2.api.Api
2525
import com.skydoves.themovies2.models.entity.Movie
26+
import com.skydoves.themovies2.view.ui.details.movie.MovieDetailActivity
2627
import kotlinx.android.synthetic.main.item_poster.view.*
2728

28-
class MovieListViewHolder(
29-
val view: View,
30-
private val delegate: Delegate
29+
class MovieListViewHolder constructor(
30+
val view: View
3131
) : BaseViewHolder(view) {
3232

33-
interface Delegate {
34-
fun onItemClick(movie: Movie)
35-
}
36-
3733
private lateinit var movie: Movie
3834

3935
@Throws(Exception::class)
@@ -59,7 +55,7 @@ class MovieListViewHolder(
5955
}
6056
}
6157

62-
override fun onClick(v: View?) = delegate.onItemClick(movie)
58+
override fun onClick(v: View?) = MovieDetailActivity.startActivityModel(context(), movie)
6359

6460
override fun onLongClick(v: View?) = false
6561
}

app/src/main/res/layout/main_fragment_movie.xml

+9
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
<variable
99
name="viewModel"
1010
type="com.skydoves.themovies2.view.ui.main.MainActivityViewModel" />
11+
12+
<variable
13+
name="adapter"
14+
type="com.skydoves.themovies2.view.adapter.MovieListAdapter" />
1115
</data>
1216

1317
<RelativeLayout
@@ -19,7 +23,12 @@
1923
android:layout_width="match_parent"
2024
android:layout_height="match_parent"
2125
android:clipToPadding="false"
26+
app:adapter="@{adapter}"
2227
app:adapterMovieList="@{viewModel.movieListLiveData}"
28+
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
29+
app:paginationMovieList="@{viewModel}"
30+
app:spanCount="2"
31+
app:toast="@{viewModel.toastLiveData}"
2332
tools:listitem="@layout/item_poster" />
2433
</RelativeLayout>
2534
</layout>

0 commit comments

Comments
 (0)