Commit 112f271c authored by Andrew Weiss's avatar Andrew Weiss
Browse files

Сделал один класс для хедеров, реализовал getItemViewType через тип ListItem,...

Сделал один класс для хедеров, реализовал getItemViewType через тип ListItem, убрал поля в генераторе и добавил возвращаемое значение
1 merge request!1New version
Showing with 96 additions and 65 deletions
+96 -65
......@@ -13,18 +13,11 @@ data class GenreData(
)
/**
* Данные обходимые для [ListItem] заголовка жанра
* Данные обходимые для [ListItem] заголовка
*/
data class GenreHeader(
override var title: String
) : Header
/**
* Данные обходимые для [ListItem] заголовка фильма
*/
data class FilmHeader(
override var title: String
) : Header
data class HeaderData(
var title: String
)
/**
* Данные обходимые для [ListItem] фильма
......@@ -41,11 +34,4 @@ data class Film(
var imageUrl: String?,
var description: String?,
var genres: List<String>?
) : Parcelable
/**
* Общий класс для заголовков
*/
interface Header {
var title: String
}
\ No newline at end of file
) : Parcelable
\ No newline at end of file
......@@ -38,5 +38,17 @@ enum class ListItemTypes {
INLINE_SELECT,
// ListItem с Switch элементом
SWITCH
SWITCH,
// ListItem c элементом жанр
GENRE,
// ListItem c элементом фильм
FILM,
// ListItem c элементом заголовок для жанров
GENRES_HEADER,
// ListItem c элементом заголовок для фильмов
FILMS_HEADER
}
\ No newline at end of file
......@@ -77,14 +77,8 @@ class FilmsFragment :
}
override fun showFilms(items: List<Film>, selectedGenre: GenreData?) {
generator.generateList(items, selectedGenre)
adapter.addListItems(
generator.genresHeader,
generator.genresList,
generator.filmsHeader,
generator.filmsList
)
val listItems = generator.generateListItems(items, selectedGenre)
adapter.addListItems(listItems)
}
override fun startContentLoading() {
......
......@@ -46,25 +46,17 @@ class FilmsAdapter(
}
override fun getItemViewType(item: ListItem): Int {
return when (item.data) {
is FilmHeader -> TYPE_FILMS_HEADER
is Film -> TYPE_FILM
is GenreHeader -> TYPE_GENRES_HEADER
is GenreData -> TYPE_GENRE
return when (item.type) {
ListItemTypes.FILMS_HEADER -> TYPE_FILMS_HEADER
ListItemTypes.FILM -> TYPE_FILM
ListItemTypes.GENRES_HEADER -> TYPE_GENRES_HEADER
ListItemTypes.GENRE -> TYPE_GENRE
else -> NOT_FOUND
}
}
fun addListItems(
genresHeader: ListItem,
genres: List<ListItem>,
filmsHeader: ListItem,
films: List<ListItem>
) {
updateItem(genresHeader, TYPE_GENRES_HEADER)
updateItems(genres, TYPE_GENRE)
updateItem(filmsHeader, TYPE_FILMS_HEADER)
updateItems(films, TYPE_FILM)
fun addListItems(listItems: List<ListItem>) {
updateItems(listItems)
}
companion object {
......
......@@ -8,24 +8,48 @@ import com.example.utils.ResourcesUtils.getString
* Класс для генерации элементов списка
*/
class FilmsGenerator {
val genresHeader =
ListItem(
data = GenreHeader(getString(R.string.title_genres)),
settings = Settings(0f, 0f, 8f, 0f)
fun generateListItems(films: List<Film>, selectedGenre: GenreData?): List<ListItem> {
val genresHeaderSettings = Settings(
leftMargin = 0f,
rightMargin = 0f,
topMargin = 8f,
bottomMargin = 0f
)
val filmsHeader =
ListItem(
data = FilmHeader(getString(R.string.title_films)),
settings = Settings(0f, 0f, 16f, 8f)
val filmsHeaderSettings = Settings(
leftMargin = 0f,
rightMargin = 0f,
topMargin = 16f,
bottomMargin = 8f
)
val listItems: MutableList<ListItem> = mutableListOf()
listItems.add(
ListItem(
type = ListItemTypes.GENRES_HEADER,
data = HeaderData(getString(R.string.title_genres)),
settings = genresHeaderSettings
)
)
var genresList: MutableList<ListItem> = mutableListOf()
var filmsList: MutableList<ListItem> = mutableListOf()
val genresListItems = generateGenreListItems(films, selectedGenre)
listItems.addAll(genresListItems)
fun generateList(films: List<Film>, selectedGenre: GenreData?) {
generateGenresList(films, selectedGenre)
generateFilmsList(films, selectedGenre)
listItems.add(
ListItem(
type = ListItemTypes.FILMS_HEADER,
data = HeaderData(getString(R.string.title_films)),
settings = filmsHeaderSettings
)
)
val filmsListItems = generateFilmsListItems(films, selectedGenre)
listItems.addAll(filmsListItems)
return listItems
}
/**
......@@ -35,8 +59,12 @@ class FilmsGenerator {
* @param films список фильмов с сервера
* @param selectedGenre выбранный жанр
*/
private fun generateGenresList(films: List<Film>, selectedGenre: GenreData?) {
genresList = mutableListOf()
private fun generateGenreListItems(
films: List<Film>,
selectedGenre: GenreData?
): List<ListItem> {
val genresList: MutableList<ListItem> = mutableListOf()
val genresFromFilms: MutableSet<String> = sortedSetOf()
films.forEach { film ->
......@@ -49,11 +77,23 @@ class FilmsGenerator {
val genre = firstCharToUpperCase(it)
if (selectedGenre != null && selectedGenre.genre == genre) {
genresList.add(ListItem(data = GenreData(genre, true)))
genresList.add(
ListItem(
type = ListItemTypes.GENRE,
data = GenreData(genre, true)
)
)
} else {
genresList.add(ListItem(data = GenreData(genre, false)))
genresList.add(
ListItem(
type = ListItemTypes.GENRE,
data = GenreData(genre, false)
)
)
}
}
return genresList
}
/**
......@@ -63,8 +103,11 @@ class FilmsGenerator {
* @param films список фильмов с сервера
* @param selectedGenre выбранный жанр
*/
private fun generateFilmsList(films: List<Film>, selectedGenre: GenreData?) {
filmsList = mutableListOf()
private fun generateFilmsListItems(
films: List<Film>,
selectedGenre: GenreData?
): List<ListItem> {
val filmsList: MutableList<ListItem> = mutableListOf()
var sortedFilms = films.sortedBy { it.localizedName }
......@@ -78,6 +121,7 @@ class FilmsGenerator {
if (i % 2 == 0) {
filmsList.add(
ListItem(
type = ListItemTypes.FILM,
data = sortedFilms[i],
settings = Settings(16f, 8f, 0f, 16f)
)
......@@ -85,12 +129,15 @@ class FilmsGenerator {
} else {
filmsList.add(
ListItem(
type = ListItemTypes.FILM,
data = sortedFilms[i],
settings = Settings(8f, 16f, 0f, 16f)
)
)
}
}
return filmsList
}
/**
......
......@@ -4,7 +4,7 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import com.example.filmsapp.R
import com.example.filmsapp.databinding.HeaderItemBinding
import com.example.filmsapp.ui.data.entities.Header
import com.example.filmsapp.ui.data.entities.HeaderData
import com.example.filmsapp.ui.data.entities.ListItem
import com.example.filmsapp.ui.data.entities.Settings
import com.example.filmsapp.ui.list.view_holders.base.BaseViewHolder
......@@ -19,11 +19,11 @@ class HeaderViewHolder(
) : BaseViewHolder(layoutInflater, parent, R.layout.header_item) {
private var binding: HeaderItemBinding = HeaderItemBinding.bind(itemView)
private lateinit var header: Header
private lateinit var header: HeaderData
private lateinit var settings: Settings
fun bind(listItem: ListItem) {
this.header = listItem.data as Header
this.header = listItem.data as HeaderData
this.settings = listItem.settings
showHeaderName()
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment