Slide 1

Slide 1 text

Groupie΍ͬͯΈΑ͏ ߴɹՅହ Android Night 2019/03

Slide 2

Slide 2 text

ϓϩϑΟʔϧ • ໊લ: ߴ Յହ (Yoshiyasu KO) • ॴଐ: ϕΨίʔϙϨʔγϣϯ • AndroidΤϯδχΞ • : @dashimaki_dofu

Slide 3

Slide 3 text

ϓϩϑΟʔϧ ʮ͠ΜͪΌΜͷਓʯͱ֮͑ͯؼ͍ͬͯͩ͘͞ • ໊લ: ߴ Յହ (Yoshiyasu KO) • ॴଐ: ϕΨίʔϙϨʔγϣϯ • AndroidΤϯδχΞ • : @dashimaki_dofu

Slide 4

Slide 4 text

ࠓ೔࿩͢͜ͱ • GroupieͬͯԿʁ • Groupieͷ؆୯ͳ࢖͍ํ

Slide 5

Slide 5 text

GroupieͬͯԿʁ

Slide 6

Slide 6 text

RecyclerViewΛͬ͘͞ͱ ࣮૷Ͱ͖ΔϥΠϒϥϦ

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

ૉ௚ʹ࣮૷ͯ͠ΈΔ

Slide 9

Slide 9 text

ૉ௚ʹ࣮૷ͯ͠ΈΔ class HelloWorldViewHolder private constructor(view: View) : RecyclerView.ViewHolder(view) { companion object { fun generate(parent: ViewGroup, inflater: LayoutInflater): HelloWorldViewHolder { val view = inflater.inflate(R.layout.hello_world_view, parent, false) return HelloWorldViewHolder(view) } } fun onBind() { /* Կ͔Viewͷૢ࡞Λߦ͏ */ } } ViewHolder ͷ࣮૷ ※ಉ༷ʹ AndroidHelloViewHolder ΋࡞Δ

Slide 10

Slide 10 text

ૉ௚ʹ࣮૷ͯ͠ΈΔ companion object { const val TYPE_HELLO = 0 const val TYPE_ANDROID = 1 } Adapter ͷ࣮૷ - ViewType ͷઃఆ

Slide 11

Slide 11 text

ૉ௚ʹ࣮૷ͯ͠ΈΔ override fun getItemCount(): Int = items.size Adapter ͷ࣮૷ - getItemCount()

Slide 12

Slide 12 text

ૉ௚ʹ࣮૷ͯ͠ΈΔ override fun getItemViewType(position: Int): Int { val item = items[position] as Data return item.type } Adapter ͷ࣮૷ - getViewType()

Slide 13

Slide 13 text

ૉ௚ʹ࣮૷ͯ͠ΈΔ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) : RecyclerView.ViewHolder { val inflater = LayoutInflater.from(context) return when (viewType) { TYPE_HELLO -> HelloWorldViewHolder.generate(parent, inflater) TYPE_ANDROID -> AndroidHelloViewHolder.generate(parent, inflater) else -> super.createViewHolder(parent, viewType) } } Adapter ͷ࣮૷ - onCreateViewHolder()

Slide 14

Slide 14 text

ૉ௚ʹ࣮૷ͯ͠ΈΔ override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { is HelloWorldViewHolder -> holder.onBind() is AndroidHelloViewHolder -> holder.onBind() } } Adapter ͷ࣮૷ - onBindViewHolder()

Slide 15

Slide 15 text

ૉ௚ʹ࣮૷ͯ͠ΈΔ // MainActivity#onCreate val items = (0 until 20).map { val type = it % 2 RecyclerAdapter.Data(type) }.toMutableList() val recyclerView = findViewById(R.id.recycler_view) recyclerView.layoutManager = LinearLayoutManager(this) recyclerView.adapter = RecyclerAdapter(this, items) RecyclerView ʹ Adapter Λઃఆ

Slide 16

Slide 16 text

GroupieͩͱͲ͏ͳΔʁ

Slide 17

Slide 17 text

GroupieͩͱͲ͏ͳΔʁ dependencies { implementation 'com.xwray:groupie:2.3.0' } લ४උ: app/gradle ʹ Groupie Λ௥Ճ

Slide 18

Slide 18 text

GroupieͩͱͲ͏ͳΔʁ class HelloWorldItem : Item() { override fun getLayout(): Int = R.layout.hello_world_view override fun bind(viewHolder: ViewHolder, position: Int) { /* Կ͔View΁ͷૢ࡞Λߦ͏ */ } } Item ͷ࣮૷ ※ಉ༷ʹ AndroidHelloItem ΋࡞Δ

Slide 19

Slide 19 text

GroupieͩͱͲ͏ͳΔʁ // GroupieActivity#onCreate val items = (0 until 20).map { when (it % 2) { 0 -> HelloWorldItem() 1 -> AndroidHelloItem() else -> HelloWorldItem() } }.toMutableList() val groupAdapter = GroupAdapter() recyclerView.adapter = groupAdapter groupAdapter.update(items) GroupAdapter ͷઃఆ

Slide 20

Slide 20 text

ऴΘΓͰ͢

Slide 21

Slide 21 text

؆୯Ͱ͢Ͷ

Slide 22

Slide 22 text

Կ͕خ͍͠ʁ

Slide 23

Slide 23 text

Կ͕خ͍͠ʁ 1. ViewHolder ͷ࣮૷ 2. ViewType ͷઃఆ 3. getItemCount() ͷ࣮૷ 4. getViewType() ͷ࣮૷ 5. onCreateViewHolder() ͷ࣮૷ 6. onBindViewHolder() ͷ࣮૷ 7. RecyclerViewʹ Adapter ઃఆ 1. Item ͷ࣮૷ 2. RecyclerViewʹ Adapter ઃఆ σϑΥϧτ (SPVQJF

Slide 24

Slide 24 text

Կ͕خ͍͠ʁ 1. ViewHolder ͷ࣮૷ 2. ViewType ͷઃఆ 3. getItemCount() ͷ࣮૷ 4. getViewType() ͷ࣮૷ 5. onCreateViewHolder() ͷ࣮૷ 6. onBindViewHolder() ͷ࣮૷ 7. RecyclerViewʹ Adapter ઃఆ 1. Item ͷ࣮૷ 2. RecyclerViewʹ Adapter ઃఆ σϑΥϧτ (SPVQJF

Slide 25

Slide 25 text

Կ͕خ͍͠ʁ 1. ViewHolder ͷ࣮૷ 2. ViewType ͷઃఆ 3. getItemCount() ͷ࣮૷ 4. getViewType() ͷ࣮૷ 5. onCreateViewHolder() ͷ࣮૷ 6. onBindViewHolder() ͷ࣮૷ 7. RecyclerViewʹ Adapter ઃఆ 1. Item ͷ࣮૷ 2. RecyclerViewʹ Adapter ઃఆ σϑΥϧτ (SPVQJF *UFN͕ʙͷॲཧΛ Ӆṭͯ͠શ෦΍ͬͯ͘ΕΔ

Slide 26

Slide 26 text

Կ͕خ͍͠ʁ 1. ViewHolder ͷ࣮૷ 2. ViewType ͷઃఆ 3. getItemCount() ͷ࣮૷ 4. getViewType() ͷ࣮૷ 5. onCreateViewHolder() ͷ࣮૷ 6. onBindViewHolder() ͷ࣮૷ 7. RecyclerViewʹ Adapter ઃఆ 1. Item ͷ࣮૷ 2. RecyclerViewʹ Adapter ઃఆ σϑΥϧτ (SPVQJF *UFN͕ʙͷॲཧΛ Ӆṭͯ͠શ෦΍ͬͯ͘ΕΔ ಛʹ͜͜

Slide 27

Slide 27 text

companion object { const val TYPE_A = 0 const val TYPE_B = 1 const val TYPE_C = 2 const val TYPE_D = 3 const val TYPE_E = 4 const val TYPE_F = 5 const val TYPE_G = 6 const val TYPE_H = 7 const val TYPE_I = 8 const val TYPE_J = 9 const val TYPE_K = 10 const val TYPE_L = 11 const val TYPE_M = 12 const val TYPE_N = 13 const val TYPE_O = 14 const val TYPE_P = 15 const val TYPE_Q = 16 const val TYPE_R = 17 const val TYPE_S = 18 const val TYPE_T = 19 const val TYPE_U = 20 const val TYPE_V = 21 const val TYPE_W = 22 const val TYPE_X = 23 const val TYPE_Y = 24 const val TYPE_Z = 25 } ΧΦεͳ7JFX5ZQF

Slide 28

Slide 28 text

companion object { const val TYPE_A = 0 const val TYPE_B = 1 const val TYPE_C = 2 const val TYPE_D = 3 const val TYPE_E = 4 const val TYPE_F = 5 const val TYPE_G = 6 const val TYPE_H = 7 const val TYPE_I = 8 const val TYPE_J = 9 const val TYPE_K = 10 const val TYPE_L = 11 const val TYPE_M = 12 const val TYPE_N = 13 const val TYPE_O = 14 const val TYPE_P = 15 const val TYPE_Q = 16 const val TYPE_R = 17 const val TYPE_S = 18 const val TYPE_T = 19 const val TYPE_U = 20 const val TYPE_V = 21 const val TYPE_W = 22 const val TYPE_X = 23 const val TYPE_Y = 24 const val TYPE_Z = 25 } ❌ ΧΦεͳ7JFX5ZQF

Slide 29

Slide 29 text

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) : RecyclerView.ViewHolder { val inflater = LayoutInflater.from(context) return when (viewType) { TYPE_A -> AViewHolder.generate(parent, inflater) TYPE_B -> BViewHolder.generate(parent, inflater) TYPE_C -> CViewHolder.generate(parent, inflater) TYPE_D -> DViewHolder.generate(parent, inflater) TYPE_E -> EViewHolder.generate(parent, inflater) TYPE_F -> FViewHolder.generate(parent, inflater) TYPE_G -> GViewHolder.generate(parent, inflater) TYPE_H -> HViewHolder.generate(parent, inflater) TYPE_I -> IViewHolder.generate(parent, inflater) TYPE_J -> JViewHolder.generate(parent, inflater) TYPE_K -> KViewHolder.generate(parent, inflater) TYPE_L -> LViewHolder.generate(parent, inflater) TYPE_M -> MViewHolder.generate(parent, inflater) // ... // else -> super.createViewHolder(parent, viewType) } } ΧΦεͳ7JFX5ZQFʹҾͬுΒΕͨΧΦεͳϝιουୡ

Slide 30

Slide 30 text

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) : RecyclerView.ViewHolder { val inflater = LayoutInflater.from(context) return when (viewType) { TYPE_A -> AViewHolder.generate(parent, inflater) TYPE_B -> BViewHolder.generate(parent, inflater) TYPE_C -> CViewHolder.generate(parent, inflater) TYPE_D -> DViewHolder.generate(parent, inflater) TYPE_E -> EViewHolder.generate(parent, inflater) TYPE_F -> FViewHolder.generate(parent, inflater) TYPE_G -> GViewHolder.generate(parent, inflater) TYPE_H -> HViewHolder.generate(parent, inflater) TYPE_I -> IViewHolder.generate(parent, inflater) TYPE_J -> JViewHolder.generate(parent, inflater) TYPE_K -> KViewHolder.generate(parent, inflater) TYPE_L -> LViewHolder.generate(parent, inflater) TYPE_M -> MViewHolder.generate(parent, inflater) // ... // else -> super.createViewHolder(parent, viewType) } } ❌ ΧΦεͳ7JFX5ZQFʹҾͬுΒΕͨΧΦεͳϝιουୡ

Slide 31

Slide 31 text

ίʔυྔΊͬͪΌݮΔ = ϝϯςφϯε͠΍͘͢ͳΔ

Slide 32

Slide 32 text

ͦͷଞͷػೳ • BindingItem • DataBindingΛར༻Ͱ͖Δ • Section • ϔομ΍ϓϨʔεϗϧμʔΛઃఆͰ͖Δ

Slide 33

Slide 33 text

ৄ͍͜͠ͱ͸... • Groupie Λ͔ͭͬͯΈΔ • https://qiita.com/aluceps/items/ 86208987f4c07331bfa0 • RecyclerViewʹΑΔϨΠΞ΢τΛָʹ͢ΔGroupieΛ1೥ ࢖ͬͯΈͯ • https://qiita.com/takahirom/items/ 4125d7c871fad534d3c2

Slide 34

Slide 34 text

ࠓ೔࿩ͨ͜͠ͱ • GroupieͬͯԿʁ • RecyclerViewΛͬ͘͞ͱ࣮૷Ͱ͖ΔϥΠϒϥϦ • Ͳ͏ָʹͳΔͷʁ • جຊ͸Item ࡞ͬͯɺGroupAdapterʹઃఆ͢Δ͚ͩ • Կ͕خ͍͠ʁ • ViewType ΍ onCreateViewHolder() ͷ࣮૷͕ෆཁ • ίʔυ͕εϦϜʹͳΓɺϝϯςφϯε͠΍͍͢

Slide 35

Slide 35 text

͡Ό ͦΏ͜ͱͰʙ