Kotlin で Jetpack Compose と Retrofit を使って API リクエスト、JSON パースして、グリッド表示するためには、以下のようにファイルを分けることができます。
1. API リクエストを行うための Retrofit インターフェースを定義するファイル
interface ApiService {
@GET("/photos")
suspend fun getPhotos(): List<Photo>
}
2. API レスポンスを表すデータクラスを定義するファイル
data class Photo(
val id: Int,
val title: String,
val url: String
)
3. API レスポンスをパースして、表示するための画面を定義するファイル
@Composable
fun PhotoGrid() {
val photos by remember { mutableStateOf<List<Photo>>(emptyList()) }
LaunchedEffect(Unit) {
val apiService = Retrofit.Builder()
.baseUrl("https://jsonplaceholder.typicode.com")
.addConverterFactory(Json {
ignoreUnknownKeys = true
}.asConverterFactory("application/json".toMediaType()))
.build()
.create(ApiService::class.java)
photos = apiService.getPhotos()
}
LazyVerticalGrid(cells = GridCells.Adaptive(minSize = 128.dp)) {
items(photos) { photo ->
Card(
modifier = Modifier.padding(4.dp),
shape = RoundedCornerShape(8.dp),
elevation = 4.dp
) {
Column(
Modifier
.fillMaxWidth()
.height(128.dp)
.padding(8.dp)
) {
Text(
text = photo.title,
style = MaterialTheme.typography.subtitle1,
maxLines = 2,
overflow = TextOverflow.Ellipsis
)
Spacer(modifier = Modifier.weight(1f))
CoilImage(
data = photo.url,
contentScale = ContentScale.Crop,
modifier = Modifier.fillMaxSize()
)
}
}
}
}
}
4. 上記の画面を表示するための Activity もしくは Fragment を定義するファイル
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
PhotoGrid()
}
}
}
以上のように、ファイルを分けることで、API リクエストやパース、表示を分離し、コードを見やすく、メンテナンスしやすくすることができます。
■ 感想
ただ、一行問いかけただけ。
ChatGPT で、ここまで書けるとは。