๋ชฉ์ฐจ
ํ๋ฉด์ด ์ผ์ง ๋ ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ก ๋ํ๋์ง ์๋ ํ์
ํ์ :
- ๋ฉ์ธ ์กํฐ๋นํฐ์ ๋ ์ด์์๋ง ๋ณด์ด๊ณ ํ๋๊ทธ๋จผํธ ๋ด๋ถ์ ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ๊ฐ ๋ณด์ด์ง ์๋ ํ์์ด ๋ฐ์ํ์๋ค.
์์ธ
- ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ฐ๋ผ UI๊ฐ ๊ฐฑ์ ๋์ง ์์ ๋ฐ์๋๋ ๋ฌธ์ ์๋ค!
ํด๊ฒฐ
- ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํจ์ ํธ์ถ ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ผ์ด๋๋ ๊ณผ์ ์ ์ ํํ ์์งํ์ง ๋ชปํ๋ค.
- ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ฐ๋ผ ui ๋ณ๊ฒฝ์ ์ฒ๋ฆฌํด์ค ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น ?
๐ซฑ Livedata์ observe๋ฅผ ํตํด ๊ตฌํํ ์ ์์๋ค.
๊ธฐ์กด ์ฝ๋
val reportList = reportViewModel.report.value
if (reportList != null) {
val reviewAdapter = ReviewAdapter()
reviewAdapter.setReportList(reportList)
binding.reviewRecyclerView.apply {
layoutManager = LinearLayoutManager(context)
adapter = reviewAdapter
}
} else {
Log.d("reportList๋ null", reportList.toString())
}
observe๋ฅผ ์ฌ์ฉํ๋๋ก ์์ ํ ์ฝ๋
reportViewModel.report.observe(viewLifecycleOwner) { reportList ->
if (reportList != null) {
val reviewAdapter = ReviewAdapter()
reviewAdapter.setReportList(reportList)
binding.reviewRecyclerView.apply {
layoutManager = LinearLayoutManager(context)
adapter = reviewAdapter
}
๊ธฐ์กด ์ฝ๋์ ์์ ํ ์ฝ๋ ์ฐจ์ด ์์๋ณด๊ธฐ
๊ธฐ์กด ์ฝ๋์ ๊ฒฝ์ฐ
report.value๋ฅผ ์ง์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ UI๊ฐ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋์ง ์๊ณ ๋ค๋ฅธ ํญ์ ํด๋ฆญํ์ ๋ ui๊ฐ ๊ฐฑ์ ๋๋ฉด์ ๋ฐ์ดํฐ๊ฐ ๋ณด์ธ ๊ฒ์ด์๋ค.
์์ ํ ์ฝ๋
๋ทฐ ๋ชจ๋ธ์ LiveData ๊ฐ์ฒด์ธ report๋ฅผ ๊ด์ฐฐํ๋ค. ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ _report.value๊ฐ ์ ๋ฐ์ดํธ๋๋ฉด ๊ด์ฐฐ์์ธ Fragment์๊ฒ ์๋ ค์ค๋ค. ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ด๋ถ์ ์์ฑํด์ค ์ฝ๋๊ฐ ์คํ๋๋ ๊ฒ์ด๋ค!
๋ฐ๋ผ์ observe๋ฅผ ์ฌ์ฉํ๋ฉด report ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ด๋ฅผ ๊ด์ฐฐํ์ฌ UI๋ฅผ ๋ณ๊ฒฝํด์ค ์ ์๋ค.
Observable์ด ๋ฌด์์ผ๊น??
LiveData๋ ๋ฐ์ดํฐ ํ๋ ์ญํ ์ ํ๋ฉฐ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ฉด ๊ด์ฐฐ์๋ค์๊ฒ ์๋ ค์ฃผ๋ ๊ธฐ๋ฅ์ ํ๋ค.
observe ํจ์๋ฅผ ํธ์ถํ๋ฉด LiveData์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ง์ ํ ์ฝ๋ฐฑ์ด ์คํ๋๋ค.
observable์ด๋
ํ ๊ตฌ์ฑ ์์์ ๋ค๋ฅธ ๊ตฌ์ฑ์์๋ฅผ ํต์ ํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ํ ๊ฐ์ฒด์์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ๋ก ๊ฐ๊ณ ์ง์ ํธ์ถํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ ์๋๋ก์ด๋์์๋ ์ด ๋ฐฉ๋ฒ์ ๋ฌธ์ ๊ฐ ์๋ค.
์๋๋ก์ด๋ ๊ตฌ์ฑ ์์๋ ์๋ช ์ฃผ๊ธฐ์ ์๋ช ์ด ์๋ค.
ํ๋ฉด ํ์ : ํ๋์ recreateํ๋ค.
ํ๋์์ ๋ทฐ๋ชจ๋ธ์ ์ฐธ์กฐ๋ก ๊ฐ์ง๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ก ์ด์ด์ง ์ ์์ผ๋ฏ๋ก ์ข์ง ์๋ค.
๋ฐ๋ผ์ ๋ทฐ ๋ชจ๋ธ์ ํ๋์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๋ ๋์ ํ๋์ ๋ทฐ๋ชจ๋ธ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ๋๋ก ํ์.
๊ทธ๋ฌ๋ฉด ๋ทฐ๋ชจ๋ธ์์ ํ๋์ผ๋ก ์ด๋ป๊ฒ ํต์ ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ๊น?
ํ๋์ด ๋ทฐ๋ชจ๋ธ์ ๊ด์ฐฐํ๋๋ก ํ์!!
์ด๋ฅผ ์ํด Observable Livedata๋ฅผ ์ฌ์ฉํ๋ค.
์ด๋ ๊ฒ ํ๊ธฐ ์ํด์๋ ViewModel์์ Livedata๋ฅผ ๋ ธ์ถํ๋ค.
private var _report =
MutableLiveData<ArrayList<ReportList>>()
val report: LiveData<ArrayList<ReportList>>
get() = _report
๊ทธ๋ฆฌ๊ณ ํ๋ / ํ๋๊ทธ๋จผํธ์์๋ ์ค์ ๊ตฌ๋ ์ ์ํํ๋ค. Livedata ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํธ์ถ๋๋ค.
reportViewModel.report.observe(viewLifecycleOwner) { reportList ->
reviewAdapter = ReviewAdapter()
reviewAdapter.setReportInfo(reportList)
initRecyclerView()
}
์ด๋ ๊ฒ ๋ทฐ๋ชจ๋ธ์์ ๋ ธ์ถํด์ค report ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํ๋๊ทธ๋จผํธ์์๋ ์ํํ ๋์์ ์ ์ํด์ค ์ ์์๋ค.
์ด๋ ๊ฒ ๋ฉ์ธ ํ๋ฉด์ ๋ณด์ฌ์ค ์ ์ฒด ๊ฒ์๊ธ๋ค์ ์๋ฒ์์ ๋ฐ์์์ ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ๋ฅผ ํตํด ํ๋๊ทธ๋จผํธ์ ๋ณด์ฌ์ฃผ๋ ์์ ์ ์๋ฃํ์๋ค.
viewLifecyclerOwner์ lifecycleOwner์ ์ฐจ์ด๋?
livedata๋ฅผ observeํ ๋ viewLifecyclerOwner ์ lifecycleOwner์ ์ฐจ์ด๊ฐ ๋ฌด์์ด๊ณ , ๋์ ๊ฒฝ์ฐ์๋ ๋ฌด์์ด ์ ์ ํ์ง ์ดํดํด๋ณด์
์ฐ์ lifecyclerOwner์ ํ๋๊ทธ๋จผํธ ์์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. onAttach๋ถํฐ onDestory๊น์ง ์ฐ๊ฒฐ๋์ด์๋ค.
fragment view์ lifecycler๋ณด๋ค fragment lifecycler์ด ๊ธธ๋ค.
๋ง์ฝ ๋ทฐ๋ ์๋ฉธ๋์๋๋ฐ fragment ์์ฒด๊ฐ ์๋ฉธ๋์ง ์์ ๊ฒฝ์ฐ livedata๋ฅผ observeํ๊ฒ ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ทฐ๊ฐ ์ฌ๋ผ์ก๊ธฐ ๋๋ฌธ์ getView๋ฅผ ํ๋ฉด null์ด ๋ฐ์ํ๊ณ IllegalStateException์ด ๋ฐ์ํ ์ ์๋ค.
viewLifecycleOwner์ ํ๋๊ทธ๋จผํธ ๋ทฐ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ด ํด๋์ค๋ onCreateView ~ onDestroyView๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๋ฐ๋ผ์ ํ๋๊ทธ๋จผํธ ui๊ฐ ํ์ฑํ๋์ด์๊ฑฐ๋ ๋นํ์ฑํ๋์ด์์ ๋ ์ฐ๊ฒฐ๋๋ค.
LiveData๋?
livedata๋ observer์ lifecycler์ ๋ฐ๋ผ๊ฐ๋ค. ์ฌ๊ธฐ์ observer์ ์ผ๋ฐ์ ์ผ๋ก ์กํฐ๋นํฐ๋ ํ๋๊ทธ๋จผํธ์ ํด๋นํ๋ค. ๋ฐ๋ผ์ ๋ทฐ๊ฐ ์ฌ๋ผ์ง๊ฒ ๋๋ฉด livedata๋ ๊ฐ์ด ์ฌ๋ผ์ง๋ค.
LiveData ์ฌ์ฉ ๋ฐฉ๋ฒ
MutableLiveData์ธ _data๋ฅผ ์์ฑํ๋ค.
LiveData์ธ data๋ฅผ ์์ฑํ๋ค.
observe๋ฅผ ํด์ฃผ๋ ๋ฐฉ๋ฒ์ ์ฐจ์ด
๋ฐฉ๋ฒ 1
reportViewModel.report.observe(viewLifecycleOwner) { reportList ->
Log.d("์ข์์ reportList observe ํ", reportList.toString())
reviewAdapter = ReviewAdapter()
reviewAdapter.setReportInfo(reportList)
initRecyclerView()
}
๋ฐฉ๋ฒ 2
val reportObserver =
Observer<ArrayList<ReportList>> { reportList ->
reviewAdapter = ReviewAdapter()
reviewAdapter.setReportInfo(reportList)
initRecyclerView()
}
reportViewModel.report.observe(viewLifecycleOwner, reportObserver)
- LiveData ๊ฐ์ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ
- postValue
- ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ค. ๋ฐ๋ผ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ๋์ํ๋ค๊ฐ ๋ฉ์ธ ์ค๋ ๋์ ๊ฐ์ postํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋๋ค.
- ๋ฉ์ธ ์ค๋ ๋ ์ ์ฉ ์ ์ postValue()๊ฐ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋๋ค๋ฉด ๊ฐ์ฅ ๋ง์ง๋ง์ ํธ์ถ๋ ๊ฐ์ด ์ ์ฉ๋๋ค.
- Handler๋ฅผ ํตํด ๋ฉ์ธ ์ค๋ ๋์ ๊ฐ์ด ์ ๋ฌ๋๊ธฐ ์ ์ getValue๋ฅผ ํธ์ถํ๊ธฐ ๋๋ฌธ์ postValue ํธ์ถ ๋ค ๋ฐ๋ก getValue๋ก ๊ฐ์ ์ฝ์ผ๋ ค๊ณ ํ๋ฉด ๋ณ๊ฒฝ๋ ๊ฐ์ ์ฝ์ด์ค์ง ๋ชปํ ๊ฐ๋ฅ์ฑ์ด ๋์!
- ๋ฐ๋ผ์ ๋ฐ๋ก ๊ฐ์ ์ฝ์ด์ผํ ๋๋ setValue๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
- setValue
- ๋ฉ์ธ ์ค๋ ๋์์ Livedata์ ๊ฐ์ ๋ณ๊ฒฝํ๋ค.
- ๋ฐ๋ผ์ setValue๋ฅผ ํตํด ํจ์ ํธ์ถ ํ ๋ฐ๋ก getValue๋ก ๊ฐ์ ์ฝ์ด์ค๋ฉด ๋ณ๊ฒฝ๋ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค!
- postValue
'๐ค2024 ์๋๋ก์ด๋ > ๐ฟ ์ํ ํ๋ก์ ํธ ๊ฐ๋ฐ ์ผ์ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Android Recyclerview : no attached adapter , skipping layout ์๋ฌ ํด๊ฒฐ ๊ณผ์ ๊ธฐ๋ก (0) | 2024.05.15 |
---|---|
๋ก๊ทธ์ธ ์ฑ๊ณต ์ ์ฒ๋ฆฌ ์๋ฌ ํด๊ฒฐํ๊ธฐ (0) | 2024.05.13 |
Android recyclerview ์ดํดํ๊ธฐ!!! (0) | 2024.04.29 |
๐ฃ๋ฉ์ธ ํ๋ฉด API ์ฐ๋ ์ข์ถฉ์ฐ๋๊ธฐ ๊ธฐ๋ก (2) | 2024.04.08 |
Android UI : Toolbar ์ฑ ๋ฐ ์ ์ฉํด์ฃผ๊ธฐ (1) | 2024.04.07 |