# 2020-04-20 | Kotlin | Recycler view
###### tags: `kotlin` `android` `gobelins` `glide` `fragments`
Afficher une liste d'éléments dans une recycler view, avec des images en utilisant Glide et les fragments.
## Permissions (AndroidManifest.xml)
```xml
<uses-permission android:name="android.permission.INTERNET"/>
```
## Dependencies (build.graddle)
```
implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha02'
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
```
> [color=#63b5dd]
>
> Ne pas oublier de resynchroniser si nécessaire.
## Code
### MainActivity.kt
```kotlin
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Créer nouvelle instance fragment
change(CategoriesFragment())
}
}
fun FragmentActivity.change(fragment: Fragment) {
supportFragmentManager.beginTransaction().apply {
replace(R.id.container, fragment)
addToBackStack(null)
}.commit()
}
```
### Categoriesfragment.kt
```kotlin
class Categoriesfragment: Fragment() {
private lateinit var adapter: ArrayAdapter<String>
private lateinit var recycler_view: RecyclerView
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.categories_view,container,false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recycler_view = view.findViewById(R.id.recycler_view)
bindRecyclerView()
}
private fun bindRecyclerView() {
val categories = listOf(
Categorie("Politique", "C'est ça la politique", "https://cdn.1min30.com/wp-content/uploads/2018/12/shutterstock_1075959185-copie.jpg"),
Categorie("Economie","c'est l'économie", "https://lobservateur.info/wp-content/uploads/2019/04/5b02e7a498cdc.jpg"),
Categorie("Education","c'est l'éducation", "https://www.touteleurope.eu/fileadmin/_processed_/0/7/politique-euro-formation-education-a387ed0502.jpg"),
Categorie("Pandémie","c'est la pandémie", "https://cdn.futura-sciences.com/buildsv6/images/wide1920/5/5/a/55adb6fe27_50161581_pandemie-denisismagilov-adobe-stock.jpg"),
Categorie("Sciences","c'est la sciences", "https://cdn.futura-sciences.com/buildsv6/images/wide1920/a/0/2/a0269d7a2e_50155960_science-20e-siecle-artinspiring-fotolia.jpg"),
Categorie("Ecologie","c'est l'écologie", "https://youmatter.world/app/uploads/sites/3/2018/08/ecologie-solutions.jpg")
)
val adapterRecycler = CategorieAdapter(categories)
recycler_view.layoutManager = LinearLayoutManager(context)
recycler_view.adapter = adapterRecycler
}
}
```
> [color=#63b5dd]
>
> Attention au format des images. Certains ne sont pas pris en compte...
### categories_view.xml
```xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="377dp"
android:layout_height="483dp"
app:layout_constraintBottom_toTopOf="@+id/btn_articles_fragment"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:listitem="@layout/list_item" />
<Button
android:id="@+id/btn_articles_fragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Articles fragment"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
```
### Categorie.kt
```kotlin
class Categorie(name: String, description: String, url:String) {
val name:String = name
val description:String = description
val url:String = url
}
```
### CategorieAdapter.kt
```kotlin
@GlideModule
class CategorieAdapter(private val dataset: List<Categorie>) :
RecyclerView.Adapter<CategorieAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val rootView = LayoutInflater.from(parent.context)
.inflate(R.layout.list_item, parent, false)
return ViewHolder(rootView)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) =
holder.bind(dataset[position])
override fun getItemCount(): Int = dataset.size
class ViewHolder(val root: View) : RecyclerView.ViewHolder(root) {
fun bind(item: Categorie) {
val txtTitle = root.findViewById<TextView>(R.id.categorie_name)
val txtDesc = root.findViewById<TextView>(R.id.categorie_description)
val img = root.findViewById<ImageView>(R.id.categorie_image)
Glide.with(root.context).load(item.url).fitCenter().into(img)
txtTitle.text = item.name
txtDesc.text = item.description
}
}
}
```
### list_item.xml
```xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/categorie_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="TextView"
android:textStyle="bold"
android:textSize="26sp"
android:textAlignment="center"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="MissingConstraints" />
<ImageView
android:id="@+id/categorie_image"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/categorie_name"
app:srcCompat="@drawable/ic_launcher_background" />
<TextView
android:id="@+id/categorie_description"
android:layout_width="0dp"
android:layout_height="60dp"
android:text="TextView"
android:textAlignment="center"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/categorie_image" />
</androidx.constraintlayout.widget.ConstraintLayout>
```