Slide 1

Slide 1 text

Լ઒ܟ߂ !BOESPIJ $PODBU"EBQUFSΛਂ۷Δ QPUBUPUJQT

Slide 2

Slide 2 text

w Լ઒ܟ߂ w ᷂;0;0ςΫϊϩδʔζॴଐ w !BOESPIJ w ϙϦϓςϧεʢݹ୅ڕʣ ࣗݾ঺հ

Slide 3

Slide 3 text

ΞδΣϯμ w $PODBU"EBQUFSͱ͸ʁ w $PODBU"EBQUFSͷϢʔεέʔε w $PODBU"EBQUFSͷ໾ׂ w 7JFX5ZQFͱ4UBCMF*%ʹ͍ͭͯ w $PODBU"EBQUFS͕ߦ͍ͬͯΔ੍ޚ w ·ͱΊ

Slide 4

Slide 4 text

$PODBU"EBQUFSͱ͸ʁ l"O3FDZDMFS7JFX"EBQUFSJNQMFNFOUBUJPOUIBUQSFTFOUTUIFDPOUFOUTPGNVMUJQMFBEBQUFSTJOTFRVFODFz "OESPJE%FWFMPQFST3FGFSFODF ˞3FDZDMFS7JFXϥΠϒϥϦWFSҎ্͕ඞཁͰ͢ val headerAdapter = HeaderAdapter() val itemAdapter = ItemAdapter() val concatAdapter = ConcatAdapter(headerAdapter, itemAdapter) binding.recyclerView.adapter = concatAdapter

Slide 5

Slide 5 text

$PODBU"EBQUFSͱ͸ʁ RecyclerView ConcatAdapter HeaderAdapter ItemAdapter γʔέϯγϟϧ

Slide 6

Slide 6 text

$PODBU"EBQUFSͱ͸ʁ RecyclerView ConcatAdapter HeaderAdapter ItemAdapter γʔέϯγϟϧ

Slide 7

Slide 7 text

$PODBU"EBQUFSͷϢʔεέʔε )FBEFS *UFN" *UFN# 'PPUFS *UFN# *UFN" *UFN" *UFN" *UFN# ୯Ұͷ"EBQUFS w ͍Ζ͍Ζͳ7JFX5ZQFΛఆٛ w ͍Ζ͍Ζͳ7JFX)PMEFSͷੜ੒ͱEBUBͷCJOEJOH w ෳࡶͳϦετΞΠςϜͷΧ΢ϯτ $PODBU"EBQUFS w ࢠ"EBQUFSͷ࣮૷࣍ୈͰ͸7JFX5ZQFͷఆٛෆཁ w ґଘ͢Δ7JFX)PMEFS͸छྨ w γϯϓϧͳϦετΞΠςϜͷΧ΢ϯτ

Slide 8

Slide 8 text

$PODBU"EBQUFSͷ໾ׂ w ௥Ճ͞Εͨ"EBQUFSͰOPUJGZϝιου͕ݺ͹ΕͨΒɺ3FDZDMFS7JFXʹ఻͑Δ લʹP⒎TFUΛܭࢉͯ͠OPUJGZ*UFN3BOHF$IBOHFE ΛݺͿ w $PODBU"EBQUFS$POpHΫϥεΛ༻͍ͯɺ7JFX5ZQFͱ4UBCMF*%ʹؔ͢Δ "EBQUFSؒͷ੍ޚΛߦ͏

Slide 9

Slide 9 text

3FDZDMFS7JF͆ʹ఻͑ΔલʹPGGTFUΛܭࢉ͢Δ @Override public void onItemRangeChanged(@NonNull NestedAdapterWrapper nestedAdapterWrapper, int positionStart, int itemCount) { final int offset = countItemsBefore(nestedAdapterWrapper); mConcatAdapter.notifyItemRangeChanged( positionStart + offset, itemCount ); }

Slide 10

Slide 10 text

7JFX5ZQFͷ੍ޚʹ͍ͭͯ w 5SVF$PODBU"EBQUFS಺ͷ"EBQUFSؒͰ7JFX5ZQFΛڞ༗͠ͳ͍ w 'BMTFશͯͷ"EBQUFS͕ಉ͡7JFX5ZQFͳΒಉ͡7JFX)PMEFSΛࢀর͢Δ ʢ(MPCBM7JFX5ZQF1PPMΛڞ༗͢Δʣ public final boolean isolateViewTypes

Slide 11

Slide 11 text

4UBCMF*%ͷ੍ޚʹ͍ͭͯ w *40-"5&%@45"#-&@*%4 w શͯͷ"EBQUFS͕4UBCMF*%Λ࣋ͭ͜ͱΛڧ੍͠ɺ"EBQUFSؒͰ*%ϓʔϧΛ෼཭͢Δ w /0@45"#-&@*%4 w "EBQUFS͕4UBCMF*%Λ஌ΒͤΔ͜ͱΛཁٻ͠ͳ͍ʢσϑΥϧτʣ w 4)"3&%@45"#-&@*%4 w શͯͷ"EBQUFS͕4UBCMF*%Λ࣋ͭ͜ͱΛڧ੍͠ɺ"EBQUFSؒͰ*%ϓʔϧΛڞ༗͢Δ public final ConcatAdapter.Config.StableIdMode stableIdMode

Slide 12

Slide 12 text

$PODBU"EBQUFS͕ߦ͍ͬͯΔ੍ޚ public ConcatAdapter( @NonNull Config config, @NonNull List extends Adapter extends ViewHolder>> adapters) { mController = new ConcatAdapterController(this, config); for (Adapter extends ViewHolder> adapter : adapters) { addAdapter(adapter); } super.setHasStableIds(mController.hasStableIds()); } public boolean hasStableIds() { return mStableIdMode != NO_STABLE_IDS; }

Slide 13

Slide 13 text

$PODBU"EBQUFS͕ߦ͍ͬͯΔ੍ޚ ConcatAdapterController(ConcatAdapter concatAdapter, ConcatAdapter.Config config) { mConcatAdapter = concatAdapter; // setup view type handling if (config.isolateViewTypes) { mViewTypeStorage = new ViewTypeStorage.IsolatedViewTypeStorage(); } else { mViewTypeStorage = new ViewTypeStorage.SharedIdRangeViewTypeStorage(); } // setup stable id handling mStableIdMode = config.stableIdMode; if (config.stableIdMode == NO_STABLE_IDS) { mStableIdStorage = new StableIdStorage.NoStableIdStorage(); } else if (config.stableIdMode == ISOLATED_STABLE_IDS) { mStableIdStorage = new StableIdStorage.IsolatedStableIdStorage(); } else if (config.stableIdMode == SHARED_STABLE_IDS) { mStableIdStorage = new StableIdStorage.SharedPoolStableIdStorage(); } else { throw new IllegalArgumentException("unknown stable id mode"); } }

Slide 14

Slide 14 text

͞Βʹਂງͬͨ಺༰͸ %SPJE,BJHJʹͯʁ

Slide 15

Slide 15 text

·ͱΊ w $PODBU"EBQUFSΛ࢖͏͜ͱͰɺෳ਺ͷ"EBQUFSΛ3FDZDMFS7JFXʹηοτͰ ͖Δ w "EBQUFSؒͷ7JFX5ZQF΍4UBCMF*%ͷ੍ޚΛɺ$PODBU"EBQUFSͷ಺෦Ͱ͍͍ ײ͡ʹ΍ͬͯ͘ΕΔ w Ͳ͏΍͍͍ͬͯײ͡ʹͯ͠Δͷ͔Λௐ΂ͯΈΔͱ໘നͦ͏

Slide 16

Slide 16 text

ࢀߟυΩϡϝϯτ w IUUQTNFEJVNDPNBOESPJEEFWFMPQFSTNFSHFBEBQUFSTTFRVFOUJBMMZ XJUINFSHFBEBQUFSEB w IUUQTEFWFMPQFSBOESPJEDPNSFGFSFODFBOESPJEYSFDZDMFSWJFX XJEHFU$PODBU"EBQUFS w IUUQTEFWFMPQFSBOESPJEDPNSFGFSFODFBOESPJEYSFDZDMFSWJFX XJEHFU$PODBU"EBQUFS$POpH w IUUQTEFWFMPQFSBOESPJEDPNSFGFSFODFBOESPJEYSFDZDMFSWJFX XJEHFU$PODBU"EBQUFS$POpH4UBCMF*E.PEF

Slide 17

Slide 17 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠