Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
How to implement TimetablelLayoutManager
Search
Moyuru Aizawa
March 06, 2019
Programming
750
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
How to implement TimetablelLayoutManager
Moyuru Aizawa
March 06, 2019
More Decks by Moyuru Aizawa
See All by Moyuru Aizawa
BLUETOOTH_SCAN and iBeacon
lvla
1
150
graphicsLayer
lvla
0
300
BluetoothDevice.getName()に裏切られた話
lvla
0
410
Jetpack Composeで画像クロップ機能を実装する
lvla
0
1.3k
Jetpack Compose drag gesture and pinch gesture
lvla
1
4.3k
Jetpack Compose Layout API
lvla
1
710
BLEを使ったアプリを継続的に開発するために
lvla
0
1.1k
RecyclerView.ItemAnimator
lvla
1
390
RecycledViewPool
lvla
1
300
Other Decks in Programming
See All in Programming
20260722_microCMSで考える、AI時代のコンテンツ運用設計
yosh1
0
380
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
180
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
300
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
490
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
190
数百円から始めるRuby電子工作
tarosay
0
140
Built Our Own Background Agent at LayerX
layerx
PRO
9
5.1k
the container ship “Apple Silicon”@WWDC26 Recap -Japan-\(region).swift
shingangan
0
110
AIが無かった頃の素敵な出会いの話
codmoninc
1
390
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
18k
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
260
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.4k
Featured
See All Featured
Scaling GitHub
holman
464
140k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
360
Become a Pro
speakerdeck
PRO
31
6.2k
The SEO identity crisis: Don't let AI make you average
varn
0
530
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
740
Music & Morning Musume
bryan
47
7.3k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
160
Crafting Experiences
bethany
1
240
Technical Leadership for Architectural Decision Making
baasie
3
470
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
850
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
360
Transcript
%SPJE,BJHJΞϓϦͷ λΠϜςʔϒϧΛࢧ͑Δٕज़ !.PZVSV"J[BXB
MoyuruAizawa Moyuru Aizawa Software engineer of CATS Div. CyberAgent Inc.
Previously at Pairs Div. Eureka Inc.
%SPJE,BJHJDPOGFSFODFBQQ
%SPJE,BJHJDPOGFSFODFBQQ
5JNFUBCMF-BZPVUBMQIB3FMFBTFE
‣ 5JNFUBCMFΛදࣔ͢ΔͨΊͷ-BZPVU.BOBHFS ‣ ࣌ࠁΛදࣔ͢ΔͨΊͷ*UFN%FDPSBUJPO ‣ ΧϥϜ໊Λදࣔ͢ΔͨΊͷ*UFN%FDPSBUJPO ‣ ݱࡏ࣌ࠁΛදࣔ͢ΔͨΊͷ7JFXPS*UFN%FDPSBUJPO ࣮༧ఆ 5JNFUBCMF-BZPVU
‣ 3FDZDMFS7JFXͱ ‣ -BZPVU.BOBHFSͱ ‣ -BZPVU.BOBHFS͕͍ͬͯΔ͜ͱ ‣ 5JNFUBCMF-BZPVU.BOBHFSͷ࣮
"HFOEB
3FDZDMFS7JFXͱ
‣ ଟྔͷΞΠςϜΛදࣔ͢Δͷʹదͨ͠7JFX(SPVQ ‣ ը໘ʹදࣔ͞ΕΔ͚ͩΞΠςϜΛඳը͢Δ ‣ ֦ுੑ͕ߴ͍ ‣ %FDPSBUJPO ‣ "OJNBUJPO
‣ ʜ 3FDZDMFS7JFXͱ
‣ "EBQUFS ‣ -BZPVU.BOBHFS ‣ *UFN%FDPSBUJPO ‣ *UFN"OJNBUPS ‣ *UFN5PVDI)FMQFS
‣ 4OBQ)FMQFS ‣ 3FDZDMFE7JFX1PPM ‣ %JGG6UJM 3FDZDMFS7JFXͱ
-BZPVU.BOBHFSͱ
‣ 3FDZDMFS7JFXͷDIJMEWJFXTͷϨΠΞτΛ୲͢ΔϞδϡʔϧ ‣ -BZPVU.BOBHFSΛม͑Δ͜ͱͰ༷ʑͳϨΠΞτΛ࣮ݱ͢Δࣄ͕Ͱ͖ Δ -BZPVU.BOBHFSͱ
-BZPVU.BOBHFSͱ -JOFBS-BZPVU.BOBHFS (SJE-BZPVU.BOBHFS 4UBHHFSFE(SJE-BZPVU.BOBHFS 'MFYCPY-BZPVU.BOBHFS
‣ ؔػೳ͕ଟ͍ͷͰ͔ͳΓେม ‣ ϨΠΞτͷෳࡶ͞Λ૿͢ཁૉ ‣ 0SJFOUBUJPO 7FSUJDBM-BZPVU)PSJ[POUBM-BZPVU ‣ 3FWFSTF-BZPVU
‣ -5335- -BZPVU.BOBHFSͷ࣮େม
‣ PO-BZPVU$IJMESFO ‣ TDSPMM7FSUJDBMMZ#ZTDSPMM)PSJ[POUBMMZ#Z ‣ TDSPMM5P ‣ TNPPUI4DSPMM5P ‣ DPNQVUF7FSUJDBM4DSPMM&YUFOUDPNQVUF)PSJ[POUBM4DSPMM&YUFOU
‣ DPNQVUF7FSUJDBM4DSPMM0GGTFUDPNQVUF)PSJ[POUBM4DSPMM0GGTFU ‣ DPNQVUF7FSUJDBM4DSPMM3BOHFDPNQVUF)PSJ[POUBM4DSPMM3BOHF ‣ *UFN1SFGFUDI ‣ *UFN%FDPSBUJPOT ‣ *UFN"OJNBUPST ‣ 1SFEJDUJWF"OJNBUJPOT ‣ ʜ -BZPVU.BOBHFSͷؔػೳ
‣ PO-BZPVU$IJMESFO ‣ TDSPMM7FSUJDBMMZ#ZTDSPMM)PSJ[POUBMMZ#Z ‣ TDSPMM5P ‣ TNPPUI4DSPMM5P ‣ DPNQVUF7FSUJDBM4DSPMM&YUFOUDPNQVUF)PSJ[POUBM4DSPMM&YUFOU
‣ DPNQVUF7FSUJDBM4DSPMM0GGTFUDPNQVUF)PSJ[POUBM4DSPMM0GGTFU ‣ DPNQVUF7FSUJDBM4DSPMM3BOHFDPNQVUF)PSJ[POUBM4DSPMM3BOHF ‣ *UFN1SFGFUDI ‣ *UFN%FDPSBUJPOT ‣ *UFN"OJNBUPST ‣ 1SFEJDUJWF"OJNBUJPOT ‣ ʜ -BZPVU.BOBHFSͷؔػೳ
‣ PO-BZPVU$IJMESFO ‣ TDSPMM7FSUJDBMMZ#ZTDSPMM)PSJ[POUBMMZ#Z ‣ TDSPMM5P ‣ TNPPUI4DSPMM5P ‣ DPNQVUF7FSUJDBM4DSPMM&YUFOUDPNQVUF)PSJ[POUBM4DSPMM&YUFOU
‣ DPNQVUF7FSUJDBM4DSPMM0GGTFUDPNQVUF)PSJ[POUBM4DSPMM0GGTFU ‣ DPNQVUF7FSUJDBM4DSPMM3BOHFDPNQVUF)PSJ[POUBM4DSPMM3BOHF ‣ *UFN1SFGFUDI ‣ *UFN%FDPSBUJPOT ‣ *UFN"OJNBUPST ‣ 1SFEJDUJWF"OJNBUJPOT ‣ ʜ -BZPVU.BOBHFSͷؔػೳ
‣ PO-BZPVU$IJMESFO ‣ TDSPMM7FSUJDBMMZ#ZTDSPMM)PSJ[POUBMMZ#Z ‣ TDSPMM5P ‣ TNPPUI4DSPMM5P ‣ DPNQVUF7FSUJDBM4DSPMM&YUFOUDPNQVUF)PSJ[POUBM4DSPMM&YUFOU
‣ DPNQVUF7FSUJDBM4DSPMM0GGTFUDPNQVUF)PSJ[POUBM4DSPMM0GGTFU ‣ DPNQVUF7FSUJDBM4DSPMM3BOHFDPNQVUF)PSJ[POUBM4DSPMM3BOHF ‣ *UFN1SFGFUDI ‣ *UFN%FDPSBUJPOT ‣ *UFN"OJNBUPST ‣ 1SFEJDUJWF"OJNBUJPOT ‣ ʜ -BZPVU.BOBHFSͷؔػೳ
‣ PO-BZPVU$IJMESFO ‣ TDSPMM7FSUJDBMMZ#ZTDSPMM)PSJ[POUBMMZ#Z ‣ TDSPMM5P ‣ TNPPUI4DSPMM5P ‣ DPNQVUF7FSUJDBM4DSPMM&YUFOUDPNQVUF)PSJ[POUBM4DSPMM&YUFOU
‣ DPNQVUF7FSUJDBM4DSPMM0GGTFUDPNQVUF)PSJ[POUBM4DSPMM0GGTFU ‣ DPNQVUF7FSUJDBM4DSPMM3BOHFDPNQVUF)PSJ[POUBM4DSPMM3BOHF ‣ *UFN1SFGFUDI ‣ *UFN%FDPSBUJPOT ‣ *UFN"OJNBUPST ‣ 1SFEJDUJWF"OJNBUJPOT ‣ ʜ -BZPVU.BOBHFSͷؔػೳ
‣ PO-BZPVU$IJMESFO ‣ TDSPMM7FSUJDBMMZ#ZTDSPMM)PSJ[POUBMMZ#Z ‣ TDSPMM5P ‣ TNPPUI4DSPMM5P ‣ DPNQVUF7FSUJDBM4DSPMM&YUFOUDPNQVUF)PSJ[POUBM4DSPMM&YUFOU
‣ DPNQVUF7FSUJDBM4DSPMM0GGTFUDPNQVUF)PSJ[POUBM4DSPMM0GGTFU ‣ DPNQVUF7FSUJDBM4DSPMM3BOHFDPNQVUF)PSJ[POUBM4DSPMM3BOHF ‣ *UFN1SFGFUDI ‣ *UFN%FDPSBUJPOT ‣ *UFN"OJNBUPST ‣ 1SFEJDUJWF"OJNBUJPOT ‣ ʜ -BZPVU.BOBHFSͷؔػೳ
‣ PO-BZPVU$IJMESFO ‣ TDSPMM7FSUJDBMMZ#ZTDSPMM)PSJ[POUBMMZ#Z ‣ TDSPMM5P ‣ TNPPUI4DSPMM5P ‣ DPNQVUF7FSUJDBM4DSPMM&YUFOUDPNQVUF)PSJ[POUBM4DSPMM&YUFOU
‣ DPNQVUF7FSUJDBM4DSPMM0GGTFUDPNQVUF)PSJ[POUBM4DSPMM0GGTFU ‣ DPNQVUF7FSUJDBM4DSPMM3BOHFDPNQVUF)PSJ[POUBM4DSPMM3BOHF ‣ *UFN1SFGFUDI ‣ *UFN%FDPSBUJPOT ‣ *UFN"OJNBUPST ‣ 1SFEJDUJWF"OJNBUJPOT ‣ ʜ 5JNFUBCMF-BZPVU͕࣮͍ͯ͠ΔؔରԠ͍ͯ͠Δػೳ
‣ PO-BZPVU$IJMESFO ‣ TDSPMM7FSUJDBMMZ#ZTDSPMM)PSJ[POUBMMZ#Z ‣ TDSPMM5P ‣ TNPPUI4DSPMM5P ‣ DPNQVUF7FSUJDBM4DSPMM&YUFOUDPNQVUF)PSJ[POUBM4DSPMM&YUFOU
‣ DPNQVUF7FSUJDBM4DSPMM0GGTFUDPNQVUF)PSJ[POUBM4DSPMM0GGTFU ‣ DPNQVUF7FSUJDBM4DSPMM3BOHFDPNQVUF)PSJ[POUBM4DSPMM3BOHF ‣ *UFN1SFGFUDI ‣ *UFN%FDPSBUJPOT ‣ *UFN"OJNBUPST ‣ 1SFEJDUJWF"OJNBUJPOT ‣ ʜ 5JNFUBCMF-BZPVUʹ࣮༧ఆͷͷ ༏ઌத
‣ PO-BZPVU$IJMESFO ‣ TDSPMM7FSUJDBMMZ#ZTDSPMM)PSJ[POUBMMZ#Z ‣ TDSPMM5P ‣ TNPPUI4DSPMM5P ‣ DPNQVUF7FSUJDBM4DSPMM&YUFOUDPNQVUF)PSJ[POUBM4DSPMM&YUFOU
‣ DPNQVUF7FSUJDBM4DSPMM0GGTFUDPNQVUF)PSJ[POUBM4DSPMM0GGTFU ‣ DPNQVUF7FSUJDBM4DSPMM3BOHFDPNQVUF)PSJ[POUBM4DSPMM3BOHF ‣ *UFN1SFGFUDI ‣ *UFN%FDPSBUJPOT ‣ *UFN"OJNBUPST ‣ 1SFEJDUJWF"OJNBUJPOT ‣ ʜ 5JNFUBCMF-BZPVUʹ࣮༧ఆͷͷ ༏ઌ
-BZPVU.BOBHFSͷ࣮େม ΞϓϦͷཁ݅ʹ͋ΘͤͯػೳΛݶఆ͢ΕଟগָʹͳΔ ͦΕͰ׳Ε͍ͯͳ͚Ε݁ߏ͔͔࣌ؒΔ͔
-BZPVU.BOBHFS͕͍ͬͯΔ͜ͱ
‣ PO-BZPVU$IJMESFO ‣ QFSJPETͷใऩू ‣ JOJUJBMMBZPVU ‣ TDSPMM7FSUJDBMMZ#ZTDSPMM)PSJ[POUBMMZ#Z ‣ DIJMEWJFXTͷҠಈ
‣ ݟ͑ͳ͘ͳͬͨDIJMEWJFXΛSFNPWF ‣ ۭ͖εϖʔεʹDIJMEWJFXΛBEE -BZPVU.BOBHFS͕͍ͬͯΔ͜ͱ ͬ͘͟Γ
PO-BZPVU$IJMESFO ‣ ϨΠΞτͷॳظԽ ‣ ը໘ʹදࣔ͞ΕΔ͚ͩWJFXΛஔ ͍ͯ͘͠
PO-BZPVU$IJMESFO ‣ ϨΠΞτͷॳظԽ ‣ ը໘ʹදࣔ͞ΕΔ͚ͩWJFXΛஔ ͍ͯ͘͠
TDSPMM7FSUJDBMMZ#Z ‣ WJFXΛεϥΠυͤ͞Δ ‣ ݟ͑ͳ͘ͳͬͨWJFXΛফ͢ ‣ ۭ͖εϖʔεʹWJFXΛՃ͢Δ
TDSPMM7FSUJDBMMZ#Z ‣ WJFXΛεϥΠυͤ͞Δ ‣ ݟ͑ͳ͘ͳͬͨWJFXΛফ͢ ‣ ۭ͖εϖʔεʹWJFXΛՃ͢Δ
TDSPMM7FSUJDBMMZ#Z ‣ WJFXΛεϥΠυͤ͞Δ ‣ ݟ͑ͳ͘ͳͬͨWJFXΛফ͢ ‣ ۭ͖εϖʔεʹWJFXΛՃ͢Δ
TDSPMM7FSUJDBMMZ#Z ‣ WJFXΛεϥΠυͤ͞Δ ‣ ݟ͑ͳ͘ͳͬͨWJFXΛফ͢ ‣ ۭ͖εϖʔεʹWJFXΛՃ͢Δ
TDSPMM)PSJ[POUBMMZ#Z ‣ WJFXΛεϥΠυͤ͞Δ ‣ ݟ͑ͳ͘ͳͬͨWJFXΛফ͢ ‣ ۭ͖εϖʔεʹWJFXΛՃ͢Δ
TDSPMM)PSJ[POUBMMZ#Z ‣ WJFXΛεϥΠυͤ͞Δ ‣ ݟ͑ͳ͘ͳͬͨWJFXΛফ͢ ‣ ۭ͖εϖʔεʹWJFXΛՃ͢Δ
TDSPMM)PSJ[POUBMMZ#Z ‣ WJFXΛεϥΠυͤ͞Δ ‣ ݟ͑ͳ͘ͳͬͨWJFXΛফ͢ ‣ ۭ͖εϖʔεʹWJFXΛՃ͢Δ
TDSPMM)PSJ[POUBMMZ#Z ‣ WJFXΛεϥΠυͤ͞Δ ‣ ݟ͑ͳ͘ͳͬͨWJFXΛফ͢ ‣ ۭ͖εϖʔεʹWJFXΛՃ͢Δ
5JNFUBCMF-BZPVU.BOBHFSͷ࣮
5JNFUBCMF-BZPVU.BOBHFSͷ࣮ PO-BZPVU$IJMESFO
(0 until itemCount).forEach { val periodInfo = periodLookUp(it) val column
= columns.getOrPut(periodInfo.columnNumber) { ArrayList() } val period = Period( TimeUnit.MILLISECONDS.toMinutes(periodInfo.startUnixMillis).toInt(), TimeUnit.MILLISECONDS.toMinutes(periodInfo.endUnixMillis).toInt(), periodInfo.columnNumber, adapterPosition = it, positionInColumn = column.size ) periods.add(period) column.add(period) if (it == 0) { firstStartUnixMin = period.startUnixMin lastEndUnixMin = period.endUnixMin } else { firstStartUnixMin = min(period.startUnixMin, firstStartUnixMin) lastEndUnixMin = max(period.endUnixMin, lastEndUnixMin) } } ֤QFSJPEͷใऩू
(0 until itemCount).forEach { val periodInfo = periodLookUp(it) val column
= columns.getOrPut(periodInfo.columnNumber) { ArrayList() } val period = Period( TimeUnit.MILLISECONDS.toMinutes(periodInfo.startUnixMillis).toInt(), TimeUnit.MILLISECONDS.toMinutes(periodInfo.endUnixMillis).toInt(), periodInfo.columnNumber, adapterPosition = it, positionInColumn = column.size ) periods.add(period) column.add(period) if (it == 0) { firstStartUnixMin = period.startUnixMin lastEndUnixMin = period.endUnixMin } else { firstStartUnixMin = min(period.startUnixMin, firstStartUnixMin) lastEndUnixMin = max(period.endUnixMin, lastEndUnixMin) } } ֤QFSJPEͷใऩू
(0 until itemCount).forEach { val periodInfo = periodLookUp(it) val column
= columns.getOrPut(periodInfo.columnNumber) { ArrayList() } val period = Period( TimeUnit.MILLISECONDS.toMinutes(periodInfo.startUnixMillis).toInt(), TimeUnit.MILLISECONDS.toMinutes(periodInfo.endUnixMillis).toInt(), periodInfo.columnNumber, adapterPosition = it, positionInColumn = column.size ) periods.add(period) column.add(period) if (it == 0) { firstStartUnixMin = period.startUnixMin lastEndUnixMin = period.endUnixMin } else { firstStartUnixMin = min(period.startUnixMin, firstStartUnixMin) lastEndUnixMin = max(period.endUnixMin, lastEndUnixMin) } } ֤QFSJPEͷใऩू
anchor.leftColumn = 0 val columnCount = columns.size() val offsetY =
parentTop var offsetX = parentLeft for (columnNumber in 0 until columnCount) { offsetX += addColumn( columns[columnNumber].first(), offsetX, offsetY, true, recycler) anchor.rightColumn = columnNumber if (offsetX > parentRight) break } *OJUJBMMBZPVU
val range = startPeriod.positionInColumn until column.size for (i in range)
{ val period = column[i] val (width, height) = addPeriod(period, direction, offsetX, offsetY, recycler) offsetY += height columnWidth = width if (i == startPeriod.positionInColumn) anchor.top.put(columnNum, period.adapterPosition) anchor.bottom.put(columnNum, period.adapterPosition) if (offsetY > parentBottom) break } *OJUJBMMBZPVU
val range = startPeriod.positionInColumn until column.size for (i in range)
{ val period = column[i] val (width, height) = addPeriod(period, direction, offsetX, offsetY, recycler) offsetY += height columnWidth = width if (i == startPeriod.positionInColumn) anchor.top.put(columnNum, period.adapterPosition) anchor.bottom.put(columnNum, period.adapterPosition) if (offsetY > parentBottom) break } *OJUJBMMBZPVU
anchor.leftColumn = 0 val columnCount = columns.size() val offsetY =
parentTop var offsetX = parentLeft for (columnNumber in 0 until columnCount) { offsetX += addColumn( columns[columnNumber].first(), offsetX, offsetY, true, recycler) anchor.rightColumn = columnNumber if (offsetX > parentRight) break } *OJUJBMMBZPVU
5JNFUBCMF-BZPVU.BOBHFSͷ࣮ TDSPMM7FSUJDBMMZ#Z
val bottomView = findBottomView() ?: return 0 val period =
periods.getOrNull(bottomView.adapterPosition) ?: return 0 val bottom = getDecoratedBottom(bottomView) if (period.endUnixMin == lastEndUnixMin) if (bottom == parentBottom) 0 else min(dy, bottom - parentBottom) else dy εΫϩʔϧྔͷܭࢉ
val bottomView = findBottomView() ?: return 0 val period =
periods.getOrNull(bottomView.adapterPosition) ?: return 0 val bottom = getDecoratedBottom(bottomView) if (period.endUnixMin == lastEndUnixMin) if (bottom == parentBottom) 0 else min(dy, bottom - parentBottom) else dy εΫϩʔϧྔͷܭࢉ
val bottomView = findBottomView() ?: return 0 val period =
periods.getOrNull(bottomView.adapterPosition) ?: return 0 val bottom = getDecoratedBottom(bottomView) if (period.endUnixMin == lastEndUnixMin) if (bottom == parentBottom) 0 else min(dy, bottom - parentBottom) else dy εΫϩʔϧྔͷܭࢉ
val bottomView = findBottomView() ?: return 0 val period =
periods.getOrNull(bottomView.adapterPosition) ?: return 0 val bottom = getDecoratedBottom(bottomView) if (period.endUnixMin == lastEndUnixMin) if (bottom == parentBottom) 0 else min(dy, bottom - parentBottom) else dy εΫϩʔϧྔͷܭࢉ
override fun scrollVerticallyBy( dy: Int, recycler: Recycler, state: State ):
Int { if (dy == 0) return 0 val actualDy = calculateVerticallyScrollAmount(dy) if (actualDy == 0) return 0 offsetChildrenVertical(-actualDy) … } $IJMEWJFXTͷҠಈ
override fun scrollVerticallyBy( dy: Int, recycler: Recycler, state: State ):
Int { if (dy == 0) return 0 val actualDy = calculateVerticallyScrollAmount(dy) if (actualDy == 0) return 0 offsetChildrenVertical(-actualDy) … } $IJMEWJFXTͷҠಈ
(anchor.leftColumn..anchor.rightColumn) .forEach { columnNum -> val column = columns[columnNum] val
top = periods[anchor.top[columnNum]] val bottom = periods[anchor.bottom[columnNum]] column.subList( top.positionInColumn, bottom.positionInColumn ).forEach { val view = findViewByPosition(it.adapterPosition)?: return if (getDecoratedBottom(view) >= parentTop) return removeAndRecycleView(view, recycler) val belowPosition = column[it.positionInColumn + 1] .adapterPosition anchor.top.put(columnNum, belowPosition) } } ը໘͔ΒͰͨDIJMEWJFXͷআ
(anchor.leftColumn..anchor.rightColumn) .forEach { columnNum -> val column = columns[columnNum] val
top = periods[anchor.top[columnNum]] val bottom = periods[anchor.bottom[columnNum]] column.subList( top.positionInColumn, bottom.positionInColumn ).forEach { val view = findViewByPosition(it.adapterPosition)?: return if (getDecoratedBottom(view) >= parentTop) return removeAndRecycleView(view, recycler) val belowPosition = column[it.positionInColumn + 1] .adapterPosition anchor.top.put(columnNum, belowPosition) } } ը໘͔ΒͰͨDIJMEWJFXͷআ
(anchor.leftColumn..anchor.rightColumn) .forEach { columnNum -> val column = columns[columnNum] val
top = periods[anchor.top[columnNum]] val bottom = periods[anchor.bottom[columnNum]] column.subList( top.positionInColumn, bottom.positionInColumn ).forEach { val view = findViewByPosition(it.adapterPosition)?: return if (getDecoratedBottom(view) >= parentTop) return removeAndRecycleView(view, recycler) val belowPosition = column[it.positionInColumn + 1] .adapterPosition anchor.top.put(columnNum, belowPosition) } } ը໘͔ΒͰͨDIJMEWJFXͷআ
(anchor.leftColumn..anchor.rightColumn) .forEach { columnNum -> val column = columns[columnNum] val
top = periods[anchor.top[columnNum]] val bottom = periods[anchor.bottom[columnNum]] column.subList( top.positionInColumn, bottom.positionInColumn ).forEach { val view = findViewByPosition(it.adapterPosition)?: return if (getDecoratedBottom(view) >= parentTop) return removeAndRecycleView(view, recycler) val belowPosition = column[it.positionInColumn + 1] .adapterPosition anchor.top.put(columnNum, belowPosition) } } ը໘͔ΒͰͨDIJMEWJFXͷআ
(anchor.leftColumn..anchor.rightColumn) .forEach { columnNum -> val column = columns[columnNum] val
top = periods[anchor.top[columnNum]] val bottom = periods[anchor.bottom[columnNum]] column.subList( top.positionInColumn, bottom.positionInColumn ).forEach { val view = findViewByPosition(it.adapterPosition)?: return if (getDecoratedBottom(view) >= parentTop) return removeAndRecycleView(view, recycler) val belowPosition = column[it.positionInColumn + 1] .adapterPosition anchor.top.put(columnNum, belowPosition) } } ը໘͔ΒͰͨDIJMEWJFXͷআ
anchor.bottom.forEach { columnNum, position -> val view = findViewByPosition(position) ?:
return@forEach val bottom = getDecoratedBottom(view) if (bottom < parentBottom) { val left = getDecoratedLeft(view) val period = periods.getOrNull(position) ?: return@forEach val nextPeriod = columns.get(columnNum) .getOrNull(period.positionInColumn + 1) ?: return@forEach addPeriodsToColumn(nextPeriod, left, bottom, true, recycler) } } ۭ͖εϖʔεʹWJFXΛՃ
anchor.bottom.forEach { columnNum, position -> val view = findViewByPosition(position) ?:
return@forEach val bottom = getDecoratedBottom(view) if (bottom < parentBottom) { val left = getDecoratedLeft(view) val period = periods.getOrNull(position) ?: return@forEach val nextPeriod = columns.get(columnNum) .getOrNull(period.positionInColumn + 1) ?: return@forEach addPeriodsToColumn(nextPeriod, left, bottom, true, recycler) } } ۭ͖εϖʔεʹWJFXΛՃ
anchor.bottom.forEach { columnNum, position -> val view = findViewByPosition(position) ?:
return@forEach val bottom = getDecoratedBottom(view) if (bottom < parentBottom) { val left = getDecoratedLeft(view) val period = periods.getOrNull(position) ?: return@forEach val nextPeriod = columns.get(columnNum) .getOrNull(period.positionInColumn + 1) ?: return@forEach addPeriodsToColumn(nextPeriod, left, bottom, true, recycler) } } ۭ͖εϖʔεʹWJFXΛՃ
anchor.bottom.forEach { columnNum, position -> val view = findViewByPosition(position) ?:
return@forEach val bottom = getDecoratedBottom(view) if (bottom < parentBottom) { val left = getDecoratedLeft(view) val period = periods.getOrNull(position) ?: return@forEach val nextPeriod = columns.get(columnNum) .getOrNull(period.positionInColumn + 1) ?: return@forEach addPeriodsToColumn(nextPeriod, left, bottom, true, recycler) } } ۭ͖εϖʔεʹWJFXΛՃ
5JNFUBCMF-BZPVU.BOBHFSͷ࣮ ͜Μͳײ͡ʹͻͨ͢ΒੵΈΛ͍ͯ͘͠ɻ
·ͱΊ
‣ 3FDZDMFS7JFX͍ͧ͢͝ ‣ -BZPVU.BOBHFS͍ͧ͢͝ ‣ -BZPVU.BOBHFSେมͩͧ ‣ ΞϓϦͷཁ݅ʹΑͬͯଟগΒͩͧ͘ ·ͱΊ