
How to create GridView using Jetpack Compose. GridView is a grid-based form of view where the items in the grid are laid out in a grid arrangement. The information within the grid must be imported either from the database or an array. In this post, we’ll create a basic application to display the various programming languages in the grid, and displaying them with their names by using Jetpack Compose.
InThis Android jetpack compose article I am creating a project to showing list date in gridview in jetpack comapose and when click on card navigation to details screen.
How to create GridView using Jetpack Compose
Step-by-Step Implementation GridView using Jetpack Compose
First, create a new Android Studio Project. Android Studio
To start a new project using Android Studio Please refer to How to Start with a new Project within Android Studio. After selecting the template, choose an empty compose activity. If you are unable to locate this template, you can consider upgrading Android Studio to the latest version. We have demonstrated the app in Kotlin which is why you choose Kotlin as as the primary language when creating an New Project.
Dependencies
dependencies {
/**first we add dependencies */
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation "androidx.compose.ui:ui:$compose_version"
implementation "androidx.compose.material:material:$compose_version"
implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0'
implementation 'androidx.activity:activity-compose:1.4.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
debugImplementation "androidx.compose.ui:ui-tooling:$compose_version"
//Gson
implementation 'com.google.code.gson:gson:2.8.7'
//Navigate
implementation "androidx.navigation:navigation-compose:2.4.0-alpha08"
}
2. Creating an modal class
Browse to the app’s menu, Java > the name of your app’s package Then right-click it and choose New > Java/Kotlin Class and label your class as GridModal and add the following instructions to the class. Comments are included in the code for you to understand the code in greater detail.
package com.codeplayon.gridlayout.model
data class FruitsData(
val id:Long,
val name :String,
val desc :String
)
Step 3. Adding a new color to the Color.kt file
Go to the app, click Java > the name of your app’s package >> ui.theme Then, open the Color.kt file. Add the following code.
step 4: Add photos to the folder that can be drawn
Copy all images that you would like to include to the view grid. Go to the app, Res > Drawable. Right-click and copy all images into the folder for drawable.
Step 5: Create a FruitDataDetails.kt file for date parser.
package com.codeplayon.gridlayout.view
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.codeplayon.gridlayout.model.FruitsData
import com.codeplayon.gridlayout.ui.theme.Purple500
import com.codeplayon.gridlayout.R
@Composable
fun FruitsDataDetails(data:FruitsData){
Column(modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Column(modifier = Modifier.fillMaxWidth()
.height(50.dp)
.background(Purple500),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Text(
text ="Fruits Calories and Sugar",
color = Color.White,
fontSize = 20.sp,
fontWeight = FontWeight.Bold
)
}
Spacer(modifier = Modifier.padding(1.dp))
Image(painter = painterResource(
id = when(data.id){
1L-> R.drawable.apple_min
2L -> R.drawable.banana_min
3L -> R.drawable.orange_min
4L -> R.drawable.grapes_min
5L -> R.drawable.pomegranate_min
6L -> R.drawable.kiwifruit_min
7L -> R.drawable.papaya_min
8L -> R.drawable.pineapple_min
9L -> R.drawable.avocado_min
10L -> R.drawable.peach_min
11L-> R.drawable.apple_min
12L -> R.drawable.banana_min
13L -> R.drawable.orange_min
14L -> R.drawable.grapes_min
15L -> R.drawable.pomegranate_min
16L -> R.drawable.kiwifruit_min
17L -> R.drawable.papaya_min
18L -> R.drawable.pineapple_min
19L -> R.drawable.avocado_min
else -> R.drawable.apple_min
}
),
contentDescription = "Grid Image",
modifier = Modifier
.clip(RoundedCornerShape(10.dp)),
alignment = Alignment.Center
)
Spacer(modifier = Modifier.padding(10.dp))
Text(
text = data.name,
modifier = Modifier
.align(Alignment.CenterHorizontally),
color = Color.Black,
fontSize = 20.sp,
fontWeight = FontWeight.Bold
)
Spacer(modifier = Modifier.padding(1.dp))
Text(
text = data.desc,
modifier = Modifier
.align(Alignment.Start)
.padding(6.dp),
color = Color.Black,
fontSize = 16.sp,
fontWeight = FontWeight.Normal,
)
}
}
Step 6: Create FruitsGridLayout.kt file and user below code.
Hare we are create a card view for shiwing date GridView using Jetpack Compose.
package com.codeplayon.gridlayout.view
import android.content.Context
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.GridCells
import androidx.compose.foundation.lazy.LazyVerticalGrid
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Card
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavController
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.codeplayon.gridlayout.model.FruitsData
import com.codeplayon.gridlayout.ui.theme.Purple500
import com.codeplayon.gridlayout.R
@ExperimentalFoundationApi
@Composable
fun FruitGrid(navController : NavController){
val context = LocalContext.current
val dataFileString = getJsonDataFromAsset(context,"FruitsList.json")
val gson = Gson()
val gridSampleType = object :TypeToken<List<FruitsData>>(){}.type
val fruitData : List<FruitsData> = gson.fromJson(dataFileString,gridSampleType)
Column(modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Column(modifier = Modifier
.fillMaxWidth()
.height(50.dp)
.background(color = Purple500)
.padding(6.dp),
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.Center
) {
Text(
text ="Fruits Calories and Sugar",
color = Color.White,
fontSize = 20.sp,
fontWeight = FontWeight.Bold
)
}
LazyVerticalGrid(
cells = GridCells.Fixed(3),
modifier = Modifier.padding(10.dp)
){
items(fruitData){data->
FruitDataGridItem(data,navController)
}
}
}
}
@Composable
fun FruitDataGridItem(data:FruitsData,navController :NavController){
Card(modifier = Modifier
.clickable {
val itemVal = Gson().toJson(data)
navController.navigate("grid_detail/$itemVal")
}
.padding(10.dp)
.fillMaxSize(),
elevation = 5.dp,
shape = RoundedCornerShape(5.dp)
) {
Column(modifier = Modifier) {
Image(painter = painterResource(
id = when(data.id){
1L-> R.drawable.apple_min
2L -> R.drawable.banana_min
3L -> R.drawable.orange_min
4L -> R.drawable.grapes_min
5L -> R.drawable.pomegranate_min
6L -> R.drawable.kiwifruit_min
7L -> R.drawable.papaya_min
8L -> R.drawable.pineapple_min
9L -> R.drawable.avocado_min
10L -> R.drawable.peach_min
11L-> R.drawable.apple_min
12L -> R.drawable.banana_min
13L -> R.drawable.orange_min
14L -> R.drawable.grapes_min
15L -> R.drawable.pomegranate_min
16L -> R.drawable.kiwifruit_min
17L -> R.drawable.papaya_min
18L -> R.drawable.pineapple_min
19L -> R.drawable.avocado_min
else -> R.drawable.apple_min
}
),
contentDescription = "Grid Image",
modifier = Modifier
.fillMaxSize()
.align(Alignment.CenterHorizontally)
.clip(RoundedCornerShape(5.dp)),
alignment = Alignment.Center
)
Spacer(modifier = Modifier.padding(3.dp))
Text(
text = data.name,
modifier = Modifier
.align(Alignment.CenterHorizontally),
fontSize = 15.sp,
fontWeight = FontWeight.Bold,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
Spacer(modifier = Modifier.padding(1.dp))
Text(
text = data.desc,
modifier = Modifier
.padding(7.dp,0.dp,0.dp,20.dp)
,
fontSize = 13.sp,
fontWeight = FontWeight.Normal,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
}
}
}
fun getJsonDataFromAsset(context: Context, data: String):String {
return context.assets.open(data).bufferedReader().use { it.readText() }
}
Step 7: Working using MainActivity.kt file MainActivity.kt File
Visit go to the MainActivity.ktfile and refer to the following code. The code below is for MainActivity.kt file. Comments are included within the code to explain the code more in depth. GridView using Jetpack Compose.
package com.codeplayon.gridlayout
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.navArgument
import androidx.navigation.compose.rememberNavController
import com.google.gson.Gson
import com.codeplayon.gridlayout.model.FruitsData
import com.codeplayon.gridlayout.ui.theme.GridLayoutExampleTheme
import com.codeplayon.gridlayout.view.FruitGrid
import com.codeplayon.gridlayout.view.FruitsDataDetails
class MainActivity : ComponentActivity() {
@ExperimentalFoundationApi
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
GridLayoutExampleTheme {
// A surface container using the 'background' color from the theme
Surface(color = MaterialTheme.colors.background) {
/** ok now call fun NavigatePage*/
NavigatePage()
}
}
}
}
}
@ExperimentalFoundationApi
@Composable
fun NavigatePage(){
val navHostController = rememberNavController()
NavHost(
navController = navHostController,
startDestination = "fruits_data"
){
composable("fruits_data"){
FruitGrid(navController = navHostController)
}
composable("grid_detail/{item}",
arguments = listOf(
navArgument("item"){
type = NavType.StringType
}
)
){navBackStackEntry ->
navBackStackEntry?.arguments?.getString("item")?.let { json->
val item = Gson().fromJson(json,FruitsData::class.java)
FruitsDataDetails(data = item)
}
}
}
}
@Composable
fun Greeting(name: String) {
Text(text = "Hello $name!")
}
@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
GridLayoutExampleTheme {
Greeting("Android")
}
}
Run your program to check the output of it.
Read More Tutorial





