์์
์ด๋ฒ ํ๋ก์ ํธ์์ '์ต๊ด ๊ธฐ๋ฅด๊ธฐ'๋ผ๋ ํ ๋ง๋ก 3, 7, 21, 30, 66์ผ์ ์ฌ์ง ์ธ์ฆ ๋ฆฌ์คํธ ํ๋ฉด์ ๊ฐ๋ฐํ๊ฒ ๋์๋ค.
ํ๋ฉด์ ๊ธฐ๋ฅด๊ณ ์ ํ๋ ์ต๊ด์ ์ ๋ณด๋ค๊ณผ ์ธ์ฆ ์ฌ์ง ๋ฆฌ์คํธ(์์ ์ ์ฌ๊ฐํ ์ด๋ฏธ์ง๋ค์ด ๊ฐ๋ก 3 X ์ธ๋ก n์ค๋ก ๋ ธ์ถ๋จ)๊ฐ ๋ชจ๋ ๋์์ผ ํ๊ธฐ ๋๋ฌธ์, NestedScrollView๋ฅผ root view๋ก ๋๊ณ ํ๋ฉด layout์ ๊ตฌ์ฑํ๋ค. ์ต๊ด๊ณผ ์ด๋ฏธ์ง ์ ๋ณด๋ค์ ํ๋ฉด ์ง์ ์ ์๋ฒ์์ ๋ฐ์์ ๋ ธ์ถํ๋ค.
๋ฟ๋ฏํ๊ฒ ๋ค ๋ง๋ค๊ณ ๋์, ํ ์คํธ๋ฅผ ํ๋๋ฐ 66์ผ์น ํ๋ฉด์ ์ฑ๋ฅ์ด ๋๋ฌด ๊ตฌ๋ ธ๋ค. ํ๋ฉด์ด ๋ก๋๋๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ธ๋ค. ์ด๋ฅผ ๊ฐ์ ํ๊ณ ์ ๋ง์ ๋จน๊ณ ์์ ์ ๋์ ๋ค.
์ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋๊ฐ
NestedScrollView๊ฐ ์ด๋ป๊ฒ ๋์๊ฐ๋์ง ์๊ฒ ๋์๋ค.
https://stackoverflow.com/a/44581288
RecyclerView์ ํน์ง์ด ๋ทฐ์ ์ฌ์ฌ์ฉ์ธ๋ฐ, ์๊ณ ๋ณด๋ NestedScrollView๋ ๋ทฐ๋ค์ ๊ฒฐ์ฝ ์ฌ์ฌ์ฉํ์ง ์๋ ๊ฑฐ์๋ค. NestedScrollView๋ ์์ RecyclerView์ ๋ทฐ๋ค์ ์ฒ์์ onCreateViewHolder()๋ก ์ธ๊ทธ๋ฆฌ ๋ชจ๋ ๋ค ๋ง๋ค์ด ๋๊ณ ์์ํ๋ ๊ฑฐ์๋ค. ์ฒ์์ ํ๋ฉด์ ์ง์ ํด์ 66๊ฐ์ ๋ทฐ๋ค์ ๋ค ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ๋จ์ด์ง๋ ๊ฒ์ด์๋ค.
์๋๋ก์ด๋ ๋๋ฒจ๋กํผ์ค ๊ณต์๋ฌธ์์์๋ NestedScrollView์ ๋ํด ์์ธ ์ค๋ช ์ ๋ชป ์ฐพ์์, stack overflow๋ฅผ ํตํด์ ์๊ฒ๋์๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ ์ฐพ๊ธฐ ์๋
๋ฌธ์ ํด๊ฒฐ์ ์ํด ์ฌ๋ฌ ์๋๋ฅผ ํ๋ค. ๊ทธ๋ฌ๋ ๊ทธ ์ด๋ค ์๋๋ฅผ ํด๋, ๋ฌธ์ ์ ๊ทผ๋ณธ ์์ธ์ NestedScrollView์๊ธฐ์ NestedScrollView๋ฅผ ์์ฐ๋ ๊ฒ ๊ฐ์ฅ ์ฑ๋ฅ์ด ์ข์๋ค.
1) ์ฒซ ์๋. NestedScrollView ์์ ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ์ ๋์ด๋ฅผ ๋ฏธ๋ฆฌ ์ง์ ํ๊ธฐ.
https://stackoverflow.com/a/42808874
์ฑ๋ฅ ๊ฐ์ ์ด ๋ฏธ๋ฏธํ๋ค. NestedScrollView๋ฅผ ์ฐ๋๊น... 66๊ฐ ๋ค ์ฒ์์ ๋ง๋๋๊น.๐คฆโ๏ธ
2) ๋ ๋ฒ์งธ ์๋. Adapter์ ๋ทฐ ํ์ ์ผ๋ก ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ๋ฅผ ๋ฃ์.
RecyclerView๋ฅผ ViewHolder ๋ก ํ ๋ฒ ๋ ๊ฐ์ธ์ค ๊ฒ์ด๋ค. NestedScrollView ์์ ์์ผ๋ ์ด์งํผ ์ฑ๋ฅ ๊ฐ์ ์ ์๋ค. ์ ์ด๋ฐ ์๋๋ฅผ ํ์๋์ง ์ง๊ธ์ ์ดํด๊ฐ ์ ๊ฐ๋ค๊ณ ์๊ฐํ๋๋ฐ, Wrapper ํ๋๊ฐ ์๊ธฐ๋ฉด ๋ญ๊ฐ ๋ฌ๋ผ์ง์ง ์์๊น๋ ํฌ๋ง์ ๋ถ์ก๊ณ ์ถ์ดํ๋ ๊ฑฐ ๊ฐ๋ค๐
3) ์ธ ๋ฒ์งธ ์๋. NestedScrollView๋ฅผ ์์ ๊ณ , RecyclerView ํ๋๋ฅผ root view๋ก ๋๋ค. ์ต๊ด ์ ๋ณด์ ๋ํ UI๋ค์ ๋ฃ์ Header Adapter์, ๊ธฐ์กด ์ธ์ฆ ๋ฆฌ์คํธ Adapter๋ฅผ ConcatAdapter๋ก ๋ฌถ์ด ์ฌ์ฉํ๋ค.
์ฑ๋ฅ ๊ฐ์ ์ด ๋ง์ด ์ด๋ฃจ์ด์ก๋ค. ๊ทธ๋ฐ๋ฐ ์คํฌ๋กค ์ ๋ฒ๋ฒ ์ธ๋ค.
์ต์ด ํ๋ฉด ๋ก๋ ์๊ฐ์ด ์ค์ด ๋ค์๋ค๋ ์ฑ๋ฅ ๊ฐ์ ์ ์ด๋ฃจ์ด์ก์ง๋ง, ํด๊ฒฐํด์ผํ ์ด์๋ค์ด ์๋ค.
> 1. ์คํฌ๋กค ์ ํ๋ฉด์ด ๋ฒ๋ฒ ์ธ๋ค.
> 2. Header Adpater์ ๊ธฐ์กด Adapter์ ํ๋์ LayoutManager๋ฅผ ๊ณต์ ํ๋ค. Header Adpater๋ vertical LinearLayoutManager๋ฅผ ์ฐ๋ ๊ฒ ๋ง๊ณ (๋ค๋ฅธ ๋ง๋ก ํ์๋ฉด span count๊ฐ 1์ธ GridLayoutManger), ๊ธฐ์กด Adapter๋ span count๊ฐ 3์ธ GridLayoutManager๋ฅผ ์ฐ๋ ๊ฒ ์ ํฉํ ์ํ๋ค.
4) ๋ค ๋ฒ์งธ ์๋. ConcatAdapter ์ฉ ์ปค์คํ Adapter ๋ง๋ค๊ธฐ
์ธ ๋ฒ์งธ ์๋์์ ์๋ก ๋ค๋ฅธ LayoutManger๋ฅผ ์จ์ผํ๋ Adapter๋ค์ ConcatAdapter๋ก ๋ฌถ์ด์ผ ํ๋ ์ด์๋ฅผ ๊ณ ๋ฏผํ๋ค๊ฐ ๋ฐ๊ฒฌํจ. ๊ฒฐ๊ตญ์ Wrapper Adapter๋ฅผ ์ด๋ค. ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ ์์ ๋ฆฌ์ฌ์ดํด๋ฌ ๋ทฐ ๋ ํ๋ ๋ฃ๋ ๊ฒ์ด์๋ค. ์ฑ๋ฅ ๊ฐ์ ์ด๋, ๊ตฌํ ๋ฐฉ์์ด๋ ๋ฑํ ๋ฉ๋ฆฌํธ๋ฅผ ์ฐพ์ง ๋ชปํ๋ค.
์ ํํ ํด๊ฒฐ ๋ฐฉ๋ฒ
์ธ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ ํํ๋ค. NestedScrollView๋ ์์ ๊ณ ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ ํ๋๋ก ๋ค ํด๊ฒฐํ๋ ๋ฐฉ์์ด๋ค. ๊ฒฐ๊ตญ์ ๊ธฐ๋ฅ๊ณผ ํ๋ฉด์ ์๋ก ๋ง๋๋ ๊ฒ์ ํํ ์ ๋ฐ์ ์์๋ค.๐ฅด๐
์ธ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ํํ๋ฉด์ ๋์จ ์ด์๋ค์ ๋ค์๊ณผ ๊ฐ์ด ํด๊ฒฐํ๋ค.
1) ์คํฌ๋กค ์ ํ๋ฉด ๋ฒ๋ฒ ์
> ์ด๊ฒ๋ ์ฑ๋ฅ ๋ฌธ์ ์ด๊ธฐ์ ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ ์ฑ๋ฅ ํฅ์์ ์ํด ์์ ํ๋ค.
https://gift123.tistory.com/67
<Adpater>
- setHasStableIds(true) ์ฌ์ฉ
- fun getItemId(position: Int) : Long ์ฌ์ฉ
- ListAdapter, DiffUtil ์ฌ์ฉ (์๋๋ถํฐ ์ฐ๊ณ ์๊ธฐ๋ ํ๋ค.)
<RecyclerView>
- setHasFixedSize(true) ์ฌ์ฉ
- ์ ๋๋ฉ์ด์ ์ ๊ฑฐ : setItemAnimator(null)
<Glide>
- image size ์กฐ์ : T override(int size) ์ฌ์ฉ
- ์ด๋ฏธ์ง ๋ ธ์ถ์ fade in ์ ๋๋ฉ์ด์ ์ฌ์ฉ : transition(DrawableTransitionOptions.withCrossFade())
๋ฑ
2) ConcatAdapter์์ ํ๋์ GridLayoutManager๋ฅผ ์ฐ๋ ์ด์. Adapter ๋ง๋ค span count๊ฐ ๋ฌ๋ผ์ผ ํ๋ค.
GridLayoutManager๊ฐ ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ์ ๋ทฐ ์์ดํ ์ ๋ทฐํ์ ๋ณ๋ก span count๋ฅผ ์ ์ฉํ๋๋ก ํด์ผํ๋ค. ์ด๊ฒ์ ๊ฐ๋ฅํ๋๋ก ํ๋ ค๋ฉด, ์์ดํ ์ด ์ฐจ์งํ๋ span ๊ฐ์๋ฅผ ๋ณ๊ฒฝํด์ span count๊ฐ ๋ณ๊ฒฝ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํ ์ ์๋ค.
์ด ๋ฐฉ๋ฒ์ด ๋ค ๋ฒ์งธ ๋ฐฉ๋ฒ(Wrapper Adapter ๋ฐฉ๋ฒ)๋ณด๋ค ๊ณต์๊ฐ ๋ ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์๋ค.
1. ConcatAdapter ์์ฑ ์ Config ๊ฐ์ผ๋ก setIsolateViewType(false)๋ฅผ ์ค์ ํ๋ค.
https://developer.android.com/reference/androidx/recyclerview/widget/ConcatAdapter
2. GirdLayoutManager๊ฐ ๋ทฐ ํ์ ์ ๋ฐ๋ผ Span size๊ฐ ๋ณ๊ฒฝ๋๋๋ก SpanSizeLoopUp์ ์ค์ ํด์ค๋ค. ๊ทธ๋ผ Span count๊ฐ ๋ณ๊ฒฝ๋ ๊ฒ๊ณผ ๊ฐ์ ํจ๊ณผ๊ฐ ์๋ค.
https://developer.android.com/reference/kotlin/androidx/recyclerview/widget/GridLayoutManager
3) GirdLayoutManager ์ฌ์ฉ ์ ์ฉ RecyclerView์ ๋ทฐ ์์ดํ ๊ฐ space ์์ญ์ ์ง์ ํ๋ ์ปค์คํ ItemDecoration ์์
NestedScrollView๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์ฒซ ๊ธฐ๋ฅ ๋ฐ ํ๋ฉด ๊ตฌํ์ ํ๋ฉด์, GridLayoutManager๊ฐ ์ค์ ๋ RecyclerView์ ๋ทฐ ์ฌ์ด์ margin ๊ฐ๊ฒฉ์ ๋ฃ์ด์ฃผ๋ ์ปค์คํ Item Decoration์ ์์ฑํ๋ค. ์ฌ์ค ๋งค์ฐ ๋ฟ๋ฏํ๋ค. ์ด ์ ๋๋ฉด ์ฌ์ฉํ๊ธฐ์๋ ํธํ๊ณ , ์ฌ์ฌ์ฉ๊ฐ๋ฅํ ์ปค์คํ Item Decoration์ด๋ผ ๋ ์ธ์๋ ์ด ํ๋ก์ ํธ๋ฅผ ๋ด๋นํ๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์ฌ์ฉํ ๊ฒ์ ๊ธฐ๋ํ๋๋ฐ, ConcatAdapter์ ์ฐ๊ฒ ๋๋ฉด์ ์์ ์ด ํ์ํด์ก๋ค. ConcatAdapter์์ ์ํ๋ ๋ทฐ์๋ง space ์ฒ๋ฆฌํ๊ธฐ๊ฐ ๊น๋ค๋กญ๋ค๋ ๊ฒ์ ์์๋ค. ์๋๋ ๋ทฐ์ ๋ทฐ ์ฌ์ด(๋ด๋ถ ๊ฐ๊ฒฉ) ๋ฟ๋ง์ด ์๋๋ผ ๊ฐ์ฅ์๋ฆฌ์ ์์นํ ๋ทฐ๋ค์ ๋ฐ๊นฅ ๋ง์ง ๊ฐ(์ธ๋ถ ๊ฐ๊ฒฉ)๋ ์ฒ๋ฆฌํ ์ ์์๋ค. ๊ทธ๋ฐ๋ฐ ConcatAdapter์ ์ฐ์ด๊ฒ ๋๋ฉด์, ๋ทฐํ์ ๊ณผ ๋ทฐ์ ์์น๋ฅผ ํ๋จํ๋ ์กฐ๊ฑด์ด ๋๋ฌด๋ ๊น๋ค๋ก์์ก๋ค. ํ๋ก์ ํธ ๊ธฐ๊ฐ์ ๋ง์ถฐ์ผ ๋๊ณ , ๋ค๋ฅธ ๊ธฐ๋ฅ๋ค ๊ฐ๋ฐ๋ ํด์ผํด์ ์ด๊ฒ๋ง ๋ถ์ก์ ์๋ ์๋ ์ํฉ์ด๊ณ , ๋น์ฅ ์ฝ๊ฒ ํด๊ฒฐ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ ์๊ณ . ๋ด๋ถ ๊ฐ๊ฒฉ ์ฒ๋ฆฌ๋ง ํ๊ณ , ์ธ๋ถ ๊ฐ๊ฒฉ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๋นผ๋ ์ชฝ์ผ๋ก ํํํ๋ค.๐๐๐๐ฅบ
https://stackoverflow.com/questions/28531996/android-recyclerview-gridlayoutmanager-column-spacing
์ฒ์ ์ปค์คํ item decoration ๊ฐ๋ฐ ์ ์ฐธ๊ณ ํ์๋ค.
4) RecyclerView ๋ทฐ ์ฌ์ฌ์ฉํ๋ฉฐ ๋ฐ์ํ ์ด์๋ค ์์
NestedScrollView์์๋ ๋ทฐ ์์ดํ ๋ค์ ์ฌ์ฌ์ฉํ์ง ์์ผ๋ ๋ฌธ์ ๊ฐ ์์๋๋ฐ, ์ด์ ๋ ๋ทฐ๋ฅผ ์ฌ์ฌ์ฉํ๋ ํ์ฌ ์ํ๊ฐ ์๋๋ผ ์ด์ ์ํ์ ๋ทฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ด์๊ฐ ๋ํ๋ฌ๋ค. ์ด์ ๋ทฐ ์ํ๋ค์ ์ด๊ธฐํํ๋ ์ฝ๋๋ค์ ๋ฃ์ด์คฌ๋ค.
๋ทฐ ์ํ๋ค์ ์ด๊ธฐํํ๋ฉด์, Glide๋ก ๋ก๋ํ ์ด๋ฏธ์ง๋ฅผ ์ด๊ธฐํํ๋ ์ฝ๋๋ ์ด๋ฒ์ ์๊ฒ ๋๋ค.