๋ชฉ์ฐจ
๐๋ฌธ์ ์ํฉ
๋ฉ์ธ ํ๋ฉด์ด ๋ํ๋ ๋ ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ๊ฐ ๋ณด์ด์ง ์๋๋ค.
๐ซฑ์๋ํ ๋ฐฉ๋ฒ
๊ตฌ๊ธ๋ง์ ํตํด ๋ช๊ฐ์ง ์์ธ์ ํ์
ํ ์ ์์๊ณ , ํด๋น ๋ด์ฉ์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ํ์ธํด๋ณด์๋ค.
1๏ธโฃsetAdapter๊ฐ ์ ๋๊ณ ์๋์ง ํ์ธ
ํ๋๊ทธ๋จผํธ์์ onViewCreated, onCreateView ์์น ๋ชจ๋์ ์ ์ฉํด๋ณด์์ง๋ง ํด๊ฒฐ๋์ง ์์๋ค.
2๏ธโฃ๋ ์ด์์ ๋งค๋์ ๊ฐ ์ ์ค์ ๋์ด์๋์ง ํ์ธ
ํ๋๊ทธ๋จผํธ ์์์ ๋ ์ด์์ ๋งค๋์ ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ๊ณผ xml ๋ ์ด์์ ํ์ผ ์์์ ์ค์ ํด์ฃผ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ชจ๋ ์๋ํ์ง๋ง ํด๊ฒฐ๋์ง ์์๋ค.
- ํด๋์ค ๋ด์์ ๋ ์ด์์ ๋งค๋์ ์ค์
binding.reviewRecyclerView.layoutManager = LinearLayoutManager(context)
- ๋ ์ด์์ ํ์ผ์์ ๋ ์ด์์ ๋งค๋์ ์ค์
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/review_recycler_view"
```
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>
3๏ธโฃ binding์ด ์ ๋๋ก ์ค์ ๋์ด์๋์ง ํ์ธ
ํ ๋ธ๋ก๊ทธ ๊ธ์์ binding์ผ๋ก ๋ณ๊ฒฝ ํ ํด๊ฒฐ๋์๋ค๋ ๊ธ์ ๋ณด์๋ค.
๋น์ ์ด๋ํฐ์์๋ ๋ฐ์ธ๋ฉ์ด ์๋ findViewById ๋ก ๋ทฐ๋ฅผ ์ฐธ์กฐํด์ ์ฌ์ฉํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ๋ binding์ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝํด์ฃผ์๋ค.
๋ํ ๋ณ๊ฒฝํ๋ฉด์ binidng๊ณผ findViewById ๋ก ๋ทฐ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ ์ฐจ์ด์ ๋ํด์๋ ์์๋ณด์๋ค.(์๋์์ ๋ค๋ฃฐ ์์ !)
4๏ธโฃAdapter์์ item์ size๊ฐ 0์ด ์๋์ง ํ์ธ, Adapter๋ฅผ ListAdapter๋ก ๋ณ๊ฒฝํด์ ํ์ธ
class ReportAdapter : ListAdapter<ReportList,ReportAdapter.ReportViewHolder>(diffutil) {
```
companion object {
val diffutil = object : DiffUtil.ItemCallback<ReportList>() {
override fun areContentsTheSame(oldItem: ReportList, newItem: ReportList): Boolean {
return oldItem == newItem
}
override fun areItemsTheSame(oldItem: ReportList, newItem: ReportList): Boolean {
return oldItem.reportId ==newItem.reportId
}
}
}
}
๐จ์์ธ
์์ธ์ผ๋ก ์ถ์ธก๋๋ ๋ชจ๋ ๊ณณ์ ๋ก๊ทธ๋ฅผ ์ฌ์ด ํ์ธํด๋ณด์๋๋ฐ ๋ทฐ๋ชจ๋ธ์ livedata ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ๊ด์ฐฐ๋์ง ์์๋ค.
๋ทฐ๋ชจ๋ธ์์ report๊ฐ ๋ณ๊ฒฝ๋์ง ์๊ณ ์์๋ค.
์๋ฌ ๋ด์ฉ์ ํ์ธํด๋ณด์๋๋ ์๋ฒ์์ ๋์์ค๋ ์๋ต๊ฐ๊ณผ ์ง์ ํด์ค DTO์ ์์ฑ์ด ๋ง์ Serializable ๊ด๋ จ ์๋ฌ๊ฐ ๋ฐ์ํ๊ณ ์์๋ค.
๋๋ ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ์ ๋ณด์ฌ์ค ๋ฐ์ดํฐ ๋ฆฌ์คํธ์ ์ข์์ ์ฌ๋ถ๋ฅผ ๋ด์ ๋ฆฌ์คํธ๋ฅผ ํฉ์ณ์ ์ด๋ํฐ์ ๋๊ฒจ์ฃผ๊ธฐ ์ํด DTO ํด๋์ค์ API ์๋ต๊ฐ์๋ ์๋ isLiked ์์ฑ์ ์ถ๊ฐํด์ฃผ๊ณ ์์๋๋ฐ ์ด๊ฒ์ด ๋ฌธ์ ์ ์์ธ์ด์๋ค.
ํ์ฌ ๊ฐ์๋ฌธ์ DTO๋ ์๋ฒ์์ ์ ์ก๋๋ ์๋ต๊ฐ ํํ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผํ๋ค. ๊ทธ๋ฌ๋ ์๋ต๊ฐ์ ํฌํจ๋์ด ์์ง ์์ isLiked๋ฅผ ํฌํจํ๊ณ ์์ด ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
์์ ๊ฐ์ ํ๋ฆ์ผ๋ก ์ด๋ํฐ๊ฐ ๊ตฌ์ฑ๋์ง ์์ no attached adapter, skipping layout ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด์๋ค.
๊ฒฐ๊ตญ ๊ทผ๋ณธ์ ์ธ ์๋ฌ์๋ ๊ฒ์ด๋ค!!
๐กํด๊ฒฐ
์ฐ์ ์๋ฒ์ ์๋ต๊ฐ์ ๋ด์์ฃผ๋ ReportList ๋ฐ์ดํฐ ํด๋์ค์์ isLiked ์์ฑ์ ์ญ์ ํด์ฃผ์๋ค.
๐ซฑDTO ๋งคํ ๊ณผ์ ์ ํ์
์๋ต๊ฐ์ ๋ด๊ฐ ์ํ๋ ํํ๋ก ์กฐ์ํ ์ ์์๊น? ์์๋ณด๋ ์ค, DTO๋ฅผ ํ๋ฉด์ ๋ณด์ฌ์ค ์ ๋ณด๋ง์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฐ์ฒด๋ก ๋งคํํ๋ ๊ณผ์ ์ด ํ์ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค!
๋๋ ์ง๊ธ DTO๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ ์์ดํ ์์ ์ง์ ์ ์ผ๋ก ์ฐ์ด์ง ์๋ ์ ๋ณด๊น์ง ๋ชจ๋ ํฌํจ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ ๋ฌธ์ ๊ฐ ์์๋ค.
๋ํ ๊ฒ์๊ธ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ api์ ์๋ต์์๋ ์ข์์ ์ฌ๋ถ ์์ฑ์ ๋ด๊ณ ์์ง ์์๋ค. ๋ฐ๋ผ์
๋ฐ๋ผ์ ํ์ํ ๊ฐ์ฒด๋ก์ ๋งคํํ๋ ์์ ์ ์ํํ๋ฉฐ ์ข์์ ์ฌ๋ถ๋ฅผ ๋ด๊ณ ์๋ ์์ฑ๋ ํจ๊ป ํด๋์ค์ ๋ฃ์ด์ฃผ๊ธฐ๋ก ํ์๋ค.
์ด๋ ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ๊ฐ ์ฒ์ ๋ฐ ๋์๋ ์ข์์ ์ฌ๋ถ๊น์ง ํฌํจ๋ ํ๋ฉด์ ์ ๊ณตํ๊ธฐ ์ํด์์ด๋ค.
๋ฐ๋ผ์ ์๋์ ๊ฐ์ด ํ๋ฉด์ ๋ณด์ฌ์ค ๋ฐ์ดํฐ๋ฅผ ๋ด์ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค.
class ReportItem(
val reportId: String,
val title: String,
val content: String,
val createDate: String,
val imageUrl: String?,
val nickname: String,
val likeCount: Int,
val replyCount: Int,
val bookmarkCount: Int,
var isLiked: Boolean,
)
๊ทธ๋ฆฌ๊ณ ์๋ฒ api์์ ๋ฐ์ ์๋ต๊ฐ๊ณผ ๋งคํ์์ผ์ฃผ์๋ค.
private fun mapForReportItem(
reportList: List<ReportList>,
likeList: MutableList<Boolean>,
): List<ReportItem> {
return reportList.mapIndexed { index, reportItem ->
ReportItem(
reportId = reportItem.reportId,
title = reportItem.title,
content = reportItem.content,
createDate = reportItem.createDate,
imageUrl = reportItem.imageUrl,
nickname = reportItem.nickname,
likeCount = reportItem.likeCount,
replyCount = reportItem.replyCount,
bookmarkCount = reportItem.bookmarkCount,
isLiked = likeList[index],
)
}
}
reportList ๋ฟ ์๋๋ผ likeList๋ ๊ฐ๊ฐ ReportItem์ ๋ฃ์ด์ค์ผํ๋ค. ์ด ๋ ๊ทธ๋ฅ map์ ์ฌ์ฉํด์๋ likeList๋ฅผ isLiked ์์ฑ์ ๊ฐ๊ฐ ๋งคํํด์ค ์ ์์๋ค.
์ด๋ฅผ mapIndexed๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ ์ ์์๋ค. ์๋์์ ์์๋ณด์!
- mapIndexed๋?
- mapIndexed๋?
fun requestReport() {
viewModelScope.launch {
val result = searchReport()
if (result.isSuccess) {
val response = result.getOrNull()
if (response != null) {
response.reportList.forEach {
val likeResult = checkLike(it.reportId)
if (likeResult.isSuccess) {
likeResult.getOrNull()?.let { isLiked ->
likeList.add(isLiked)
}
}
}
_report.value = mapForReportItem(response.reportList, likeList)
```
}
๐ฅณ๋๋์ด ํด๊ฒฐ!!!
๐ก์ถ๊ฐ๋ก ๊ณต๋ถํ ๋ด์ฉ
๐ซฑ๋ทฐ ๊ฒฐํฉ๊ณผ findViewById์ ์ฐจ์ด
๐ซฑDiffUtil์ด๋?
๐ซฑDTO๋ฅผ ๋งคํํด์ค ํด๋์ค๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
๐ซฑSerializable์ ์ญํ ์ดํดํ๊ธฐ
๐ซฑCall๊ณผ Result์ ์ฌ์ฉ ์ฌ๋ก ์์๋ณด๊ธฐ
'๐ค2024 ์๋๋ก์ด๋ > Filmo ์ํ ํ๋ก์ ํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฝ๋ ์ง๋ฌธ & ๋ต๋ณ ์ ๋ฆฌ (0) | 2024.06.24 |
---|---|
Android LiveData & StateFlow ์ฐจ์ด ๋น๊ตํด๋ณด๊ธฐ(์์ฑ์ค) (0) | 2024.06.14 |
๋ก๊ทธ์ธ ์ฑ๊ณต ์ ์ฒ๋ฆฌ ์๋ฌ ํด๊ฒฐํ๊ธฐ (0) | 2024.05.13 |
๋ฉ์ธ ํ๋ฉด : ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ ๊ตฌํ ๊ณผ์ ์ ๋ฆฌ (0) | 2024.05.10 |
Android recyclerview ์ดํดํ๊ธฐ!!! (0) | 2024.04.29 |