У меня есть приложение для фильмов с архитектурой MVVM, API имеет опцию пейджинга, и при вызове мне нужно передать номер страницы в API. как мне реализовать пейджинг в моем приложении? Я должен отметить, что API предоставляет хорошие данные о номерах страниц и текущей странице.
класс данных:
data class Metadata(
val current_page: String,
val page_count: Int,
val per_page: Int,
val total_count: Int
)
мой класс модели представления:
class MovieViewModel : ViewModel() {
var movieListResponse: List<Data> by mutableStateOf(listOf())
var detailsResponse: Details by mutableStateOf(Details())
private var error: String by mutableStateOf("")
var id : Int by mutableIntStateOf(0)
fun getMovieList() {
viewModelScope.launch {
try {
val api = RetrofitInstance.api.getMovies()
movieListResponse = api.body()!!.data
} catch (e: Exception) {
error = e.message.toString()
}
}
}
fun getDetailsById() {
viewModelScope.launch {
try {
val api = RetrofitInstance.api.getDetails(id = id)
detailsResponse = api.body()!!
} catch (e: Exception) {
error = e.message.toString()
}
}
}
}
API-интерфейс:
interface ApiInterface {
@GET("movies?page=22")
suspend fun getMovies(
): Response<MoviesList>
@GET("movies/{movie_id} ")
suspend fun getDetails(
@Path("movie_id") id: Int
): Response<Details>
}
Состав пользовательского интерфейса:
fun HomeScreenUi(moviesList: List<Data>, navController: NavHostController) {
LazyVerticalGrid(
columns = GridCells.Fixed(2),
Modifier
.padding(paddingValues)
.fillMaxSize()
.background(Color.Transparent),
content = {
items(moviesList.size) {
HomeScreenUi(
itemIndex = it,
movies = moviesList,
navController = navController
)
}
}
)
}
в вашем интерфейсе API вы можете иметь что-то вроде
@GET("movies")
suspend fun getMovies(@Query("page") pageNum:Number): Response<MoviesList>
где вы передаете pageNum как нужную страницу, сохраняя состояние,
val api = RetrofitInstance.api.getMovies(pageNum = YOUR_PAGE_NUM)
Вы можете сохранить его в состоянии модели просмотра или извлечь из последнего ответа данных о фильме, поскольку вы упомянули, что он также содержит номер последней страницы.
Дайте мне знать, если у вас есть какие-либо сомнения