Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ConcatAdapterを深掘る

 ConcatAdapterを深掘る

Takahiro Shimokawa

August 12, 2021
Tweet

More Decks by Takahiro Shimokawa

Other Decks in Programming

Transcript

  1. Լ઒ܟ߂ !BOESPIJ

    $PODBU"EBQUFSΛਂ۷Δ
    QPUBUPUJQT

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. $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 γϯϓϧͳϦετΞΠςϜͷΧ΢ϯτ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. 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

    View Slide

  12. $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;
    }

    View Slide

  13. $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");
    }
    }

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide