Stworzyłem aplikację mobilną z Quizami. Wykorzystałem:
✅API
✅Retrofit
✅Glide
✅ViewBinding
✅Kotlin Coroutines
✅Hilt
✅Architecture Components (LiveData, ViewModel)
✅Room
✅Lottie
Gdy użytkownik będzie offline to wyświetli się poniższy napis, natomiast gdy będzie online to wróci do normalnego stanu i dane załadują się automatycznie. Jeżeli użytkownik przed pierwszym uruchomieniem wyłączy Internet to wyświetli mu się poniższy komunikat. W takim wypadku należy ponownie otworzyć aplikacje 😉
val url =
item.mainPhoto.url
.replace(
"https://filerepo.grupawp.pl/",
"http://i.wpimg.pl/" +
"${item.mainPhoto.width}x${item.mainPhoto.height}/filerepo.grupawp.pl/"
)
Glide.with(root.context)
.load(url)
.centerCrop()
.transition(DrawableTransitionOptions.withCrossFade())
.error(R.drawable.quiz_list)
.into(imgTitleQuiz)Zauważyłem, że Api zwraca różne ilości przycisków. Można ustawić to na sztywno i dodać do każdego przycisku odpowiednią zależność (tak też zrobiłem na początku). Ostatecznie dodałem osobny ViewHolder i Adapter.Według mnie wygląda to znacznie lepiej, niż przy pierwszym pomyśle. Przede wszystkim jest mniej kodu i jest czytelniejszy ✋
Jeżeli skończą się pytania to użytkownik zostanie przeniesiony do fragmentu ScoreQuizFragment
private val adapter: AnswerAdapter by lazy {
AnswerAdapter { answer ->
addPoint(answer)
if (currentIndex != amountQuestions - 1) {
currentIndex++
} else {
openScoreFragment()
}
viewModel.refreshQuestion()
}
}Procent dodałem w res-values-strings
<string name="result"> %s%%</string>Kiedy odpowiedź jest poprawna to zwraca z Api +1 pkt
private fun addPoint(answer: Answer) {
if (answer.isCorrect != 0) {
correctPoints += answer.isCorrect
}
}Następnie przekazuję wartość w nawigacji
private fun openScoreFragment() {
val result = (correctPoints * 100) / amountQuestions
findNavController().navigate(
R.id.action_detailsQuizFragment_to_scoreQuizFragment,
bundleOf("result" to result,
RESULT_LIST to quizId)
)
}
