Create a polished Affirmations app that uses a Recycler View to display a list of cards. Each card contains an image and affirmation text.
Thu Oct 31 2024 10:01:08 GMT+0000 (Coordinated Universal Time)
Saved by @carona
ctivity_main.xml: ?xml version="1.0" encoding="utf-8"?> <FrameLayout 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="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" app:layoutManager="LinearLayoutManager" /> </FrameLayout> MainActivity.kt package com.polymath.affirmations import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.RecyclerView import com.polymath.affirmations.adapter.ItemAdapter import com.polymath.affirmations.data.Datasource class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val myDataSet = Datasource().loadAffirmations() // getting the recycler view by its id val recyclerView: RecyclerView = findViewById(R.id.recycler_view) // this will pass the arraylist to our adapter recyclerView.adapter = ItemAdapter(this, myDataSet) recyclerView.setHasFixedSize(true) } } Steps to create a new layout resource file: Right click on “layout” -- click on “new” - select “Layout Resource File” and give file name as list_item.xml. Finally, a new xml file is created in layout folder. list_item.xml <?xml version="1.0" encoding="utf-8"?> <com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="8dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ImageView android:id="@+id/item_image" android:layout_width="match_parent" android:layout_height="194dp" android:importantForAccessibility="no" android:scaleType="centerCrop" /> <TextView android:id="@+id/item_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="16dp" android:textAppearance="?attr/textAppearanceHeadline6" /> </LinearLayout> Steps to create a class file in studio: Right click on “res” select “new” select “kotlin class/file” Affirmations.kt package com.polymath.affirmations.model import androidx.annotation.DrawableRes import androidx.annotation.StringRes data class Affirmation( @StringRes val stringResourceId: Int, @DrawableRes val imageResourceId: Int) { } DataSource class file package com.polymath.affirmations.data import com.polymath.affirmations.R import com.polymath.affirmations.model.Affirmation class Datasource { fun loadAffirmations(): List<Affirmation> { return listOf<Affirmation>( Affirmation(R.string.affirmation1, R.drawable.image1), Affirmation(R.string.affirmation2, R.drawable.image2), Affirmation(R.string.affirmation3, R.drawable.image3), Affirmation(R.string.affirmation4, R.drawable.image4), Affirmation(R.string.affirmation5, R.drawable.image5), Affirmation(R.string.affirmation6, R.drawable.image6), Affirmation(R.string.affirmation7, R.drawable.image7), Affirmation(R.string.affirmation8, R.drawable.image8), Affirmation(R.string.affirmation9, R.drawable.image9), Affirmation(R.string.affirmation10, R.drawable.image10), ) } } ItemAdapter.kt package com.polymath.affirmations.adapter import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.polymath.affirmations.R import com.polymath.affirmations.model.Affirmation class ItemAdapter( private val context: Context, private val dataset: List<Affirmation> ) : RecyclerView.Adapter<ItemAdapter.ItemViewHolder>() { class ItemViewHolder(private val view: View) : RecyclerView.ViewHolder(view) { val textView : TextView = view.findViewById(R.id.item_title) val imageView: ImageView = view.findViewById(R.id.item_image) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { //Create a new view val adapterLayout = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false) return ItemViewHolder(adapterLayout) } override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { val item = dataset[position] holder.textView.text = context.resources.getString(item.stringResourceId) holder.imageView.setImageResource(item.imageResourceId) } override fun getItemCount() = dataset.size }
Comments