Objectifs
Créer une application Android permettant de gérer des articles de presse à partir d'un web service (https://newsapi.org/)
Fonctionnalités
- Récupérer une liste d’articles en ligne
- Afficher les articles dans un recycler view
- Afficher le détail d’un article
- Sauvegarder les articles dans une BDD local
- Ajouter des fonctionnalités comme (like, partage, etc…)
Architecture de la solution
Etape 1: Créer un nouveau module
Ajouter un nouveau module dans le projet (news).
Etape 2: Mettre en place les composants nécessaires respectant l'architecture ci-dessus.
Activity principal: HomeActivity
Fragments: ArticlesFragment, ArticleDetailFragment
Layouts: home_activity, articles_list_fragment, articlet_detail_fraggment
ViewModels: ArticlesViewModel
Repository: ArticleRepository
Data Source: LocalDataSource, RemoteDataSource
Etape 3: Activity
- Modiier l'activité principale pour afficher le fragment ArticlesFragment par défaut.
Etape 3: Layouts
- home_activity.xml doit contenir un FrameLayout dans lequel vous placerez les fragments.
- articles_list_fragment.xml contient un RecyclerView
- articlet_detail_fraggment contient: un Textview pour le titre, un TextView pour la description, une ImageView pour la photo de l'auteur
Etape 3: Repository
Modifier le Repository en y ajoutant une méthode permettant de récupérer la liste des articles via le web service
a. Créer une data class (Article) modélisant les articles
b. Ajouter les dépendances de Retroit
//dependances retrofit
implementation "com.squareup.retrofit2:retrofit:2.6.2"
//dependances okhttp
implementation "com.squareup.okhttp3:okhttp:4.2.0"
//dependances gson
implementation 'com.google.code.gson:gson:2.8.5'
//dependances converter gson
implementation "com.squareup.retrofit2:converter-gson:2.5.0"
c. Créer une d'interface pour modéliser les actions du web service (contenant les actions du web service)
interface ArticleService {
@GET("/articles")
fun getArticles(): Response<List<Article>>
}
d. Créer une instance de Retroit
Modifier la classe RemoteDataSource
class RemoteDataSource {
private val service: ArticleService
init {
val retrofit = Retrofit.Builder().apply {
//Ajouter un converter pour JSON
//Ici on utilise gson
addConverterFactory(GsonConverterFactory.create())
//Ajouter l'url de base du web service
baseUrl("https://newsapi.org/")
}.build()
//Créer une instance du service
service = retrofit.create(ArticleService::class.java)
}
fun getRemoteArticles(): List<Article> {
val result = service.getArticles()
return if(result.isSuccessful) {
result.body() ?: emptyList()
}else {
emptyList()
}
}
}