View MyController.kt
class MyController : EpoxyController() { | |
override fun buildModels() { | |
HeaderImageModel_() | |
LoadingModel_() | |
MovieModel_() | |
MovieModel_() | |
FooterModel_() | |
} | |
} |
View MovieListController.kt
class MovieListController( | |
private val context: Context, | |
private val clickListener: MovieClickListener | |
) : PagedListEpoxyController<MovieModel>() { | |
private val loadMoreView = LoadMoreView_().apply { id(LoadMoreView::class.java.simpleName) } | |
var loadingMore = false | |
set(value) { | |
field = value | |
requestModelBuild() |
View MovieListEpoxyModel.kt
@EpoxyModelClass(layout = R.layout.holder_movie_landscape) | |
abstract class MovieListEpoxyModel : EpoxyModelWithHolder<MovieListEpoxyModel.Holder>() { | |
@EpoxyAttribute | |
var movieId = "" | |
@EpoxyAttribute | |
var imagePoster = "" | |
... | |
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) | |
var itemClickListener: (String) -> Unit = {} |
View MovieHomeLargeBindingModel.kt
MovieHomeLargeBindingModel_() | |
.id("${movieCategory}${this.id}") | |
.movieId(this.id) | |
.posterImage(this.getPosterUrl()) | |
.title(this.displayTitle()) | |
.rating(this.voteAverage) | |
.voteCount(this.displayVoteCount()) | |
.duration(this.displayDuration()) | |
.clickListener(clickListener) |
View item_movie_home_normal.xml
<?xml version="1.0" encoding="utf-8"?> | |
<layout 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"> | |
<data> | |
<variable | |
name="movieId" | |
type="String" /> | |
<variable |
View package-info.java
@EpoxyDataBindingPattern(rClass = R.class, layoutPrefix = "item") | |
package com.enginebai.moviehunt; | |
import com.airbnb.epoxy.EpoxyDataBindingPattern; |
View DropdownItemView.kt
@ModelView(autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT) | |
class DropdownItemView @JvmOverloads constructor( | |
context: Context, | |
attrs: AttributeSet? = null, | |
defStyleAttr: Int = 0 | |
) : LinearLayout(context, attrs, defStyleAttr) { | |
@TextProp | |
var itemText: CharSequence? = null |
View MovieController.kt
class LargeEpoxyModel : EpoxyModel { | |
override fun bind() { | |
// binding implementation | |
} | |
} | |
class NormalEpoxyModel : EpoxyModel { | |
override fun bind() { | |
// binding implementation | |
} |
View MovieHomeAdapter.kt
data class MovieModel( | |
... | |
val largeSize: Boolean | |
) | |
class MovieHomeAdapter(private val movieList: List<MovieModel>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { | |
override fun getItemViewType(position: Int): Int { | |
return if (movieList.get(position).largeSize) { | |
R.layout.item_movie_large |
View MovieDetailViewModel.kt
class MovieDetailViewModel : BaseViewModel() { | |
private val movieRepo: MovieRepo by inject() | |
private val _movieDetail = MutableLiveData<MovieModel>() | |
val posterUrl: LiveData<String> = Transformations.map(_movieDetail) { it.getPosterUrl() } | |
val title: LiveData<String> = Transformations.map(_movieDetail) { it.displayTitle() } | |
val rating: LiveData<Float> = Transformations.map(_movieDetail) { it.display5StarsRating() } | |
val voteCount: LiveData<String> = Transformations.map(_movieDetail) { it.displayVoteCount() } | |
val duration: LiveData<String> = Transformations.map(_movieDetail) { it.displayDuration() } | |
val releaseDate: LiveData<String> = Transformations.map(_movieDetail) { it.displayReleaseDate() } |
NewerOlder