Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

お気に入り画面のアイテムタブの作成 一個前のプルリクはクローズしました #29

Merged
merged 52 commits into from
Oct 24, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
f6ca085
アイテムタブ用のEntityを定義した
nemo-855 Oct 15, 2021
64b481d
favorite_item_description作成
nemo-855 Oct 15, 2021
358dbc8
FavoriteItemFragmentで無駄にbindingをFragmentのメンバ変数にしていたところを修正
nemo-855 Oct 15, 2021
af3345e
FavoriteItemFragmentでGroupieAdapterとGridLayoutManager.SpanSizeLookupの…
nemo-855 Oct 15, 2021
8a1abb6
FavoriteItemFragmentでGridLayoutのRecyclerViewを表示する処理実装
nemo-855 Oct 15, 2021
1dc0358
FavoriteItemFragmentでリストに表示するようのモデルクラスを定義して、ランダムなリストを作る関数を作成
nemo-855 Oct 15, 2021
ac44925
favorite_item_descriptionのレイアウトを整えた
nemo-855 Oct 15, 2021
dfe2375
FavoriteItemDiscriptionで画像表示の処理実装
nemo-855 Oct 15, 2021
4dcdadb
favorite_item_descriptionで画像サイズ修正
nemo-855 Oct 15, 2021
5d04552
FavoriteItemFragmentでアイテムのリストを取得する導線を修正
nemo-855 Oct 15, 2021
0923e29
FavoriteItemFragmentにAndroidEntryPointをつけた
nemo-855 Oct 15, 2021
1ec1d72
FavoriteItemCellの引数名を修正した
nemo-855 Oct 16, 2021
37155e1
BrandItem変数名修正
nemo-855 Oct 16, 2021
37d7029
fragment_favorite_new_itemの内部をRecyclerViewのみにした
nemo-855 Oct 16, 2021
97f1b5c
fragment_favoriteの不要なlayout_behavior削除
nemo-855 Oct 16, 2021
6391295
fragment_favorite coordinatorLayout周りの高さ修正
nemo-855 Oct 16, 2021
d93a7cc
favorite_new_item_item_cellの不要なmargin削除
nemo-855 Oct 16, 2021
3d10f3b
FavoriteItemCellで動的に左右のmarginをつけるようにした
nemo-855 Oct 16, 2021
70f6e7c
FavoriteItemFragmentでSpanSize指定部分のマジックナンバー回避
nemo-855 Oct 16, 2021
ac509cd
FavoriteItemFragmentで商品の情報をAPIから取ってきた前提に書き換えた
nemo-855 Oct 16, 2021
40a4425
CustomGridSpanSieLookupにadapterを直接渡すことでadapterのitemListの変更に対応できるようにした
nemo-855 Oct 16, 2021
f74c575
CustomGridSpanSieLookupのRecyclerViewにgridlayoutmanagerを渡すタイミング変更
nemo-855 Oct 16, 2021
b5cb6eb
favorite_new_item_item_cellのmarginの付け方修正
nemo-855 Oct 16, 2021
c6be146
CustomGroupieAdapter内部のdefaltのリスト生成ロジック修正
nemo-855 Oct 16, 2021
b577624
FavoriteFragmentのEntityのprefixとディレクトリ構造を整理した
nemo-855 Oct 17, 2021
58fadfa
FavoriteFragmentのEntityにFavoriteItemModelを継承させてspanSizeを定義した
nemo-855 Oct 17, 2021
2c49fe5
ディレクトリ構造の修正によるパッケージ名修正
nemo-855 Oct 17, 2021
c35914a
DisplayClothsDataにhasDiscountPercentとhasCouponPriceを定義した
nemo-855 Oct 17, 2021
181878c
FavoriteItemFragmentのCustomGroupieAdapter fun updateList内部のロジックをupdat…
nemo-855 Oct 17, 2021
9ce90f3
FavoriteItemCellで動的に左右のmarginをつけるようにした
nemo-855 Oct 16, 2021
2f90c75
favorite_new_item_item_cell margin修正
nemo-855 Oct 16, 2021
1f605f8
feat:Toolbarの作成
iroha-168 Oct 16, 2021
c750832
chore:コードレビュー指摘事項修正
iroha-168 Oct 16, 2021
581dcb0
add bindind adapter
Naoki-Hidaka Oct 16, 2021
5969c30
to private
Naoki-Hidaka Oct 16, 2021
1b99071
FavoriteItemDiscriptionのTextViewをDataBinding対応
nemo-855 Oct 17, 2021
550a35d
FavoriteItemDescriptionでカスタムのBindingAdapterを適用できるところに適用
nemo-855 Oct 17, 2021
b38c8c3
FavoriteItemFragmentのModelにspanSizeを持たせる方法をabstract class → interface…
nemo-855 Oct 17, 2021
84463d3
FavoriteItemViewModel fetchDisplayClothsListアイテム生成ロジック修正
nemo-855 Oct 17, 2021
902419b
issameas hassamecontentの実装
nemo-855 Oct 17, 2021
90f1ed1
CustomGridSpanSizeLookupでadapter itemList -> getItemに変更
nemo-855 Oct 17, 2021
8a5086b
merge main into create_favorite_item_tab
nemo-855 Oct 17, 2021
336ec4e
Apply ktlint Format
Oct 17, 2021
36a89c8
SpanSizeInterface -> HasSpanSizeItem
nemo-855 Oct 19, 2021
34fa3b2
hasSameContentAsのロジック修正
nemo-855 Oct 19, 2021
ec3021e
FavoriteItemDescriptionのisSameAs修正
nemo-855 Oct 19, 2021
67c674d
CustomGridSpanSizeLookupのgetSpanSize修正
nemo-855 Oct 19, 2021
da4e5d4
Merge branch 'create_favorite_item' of https://github.com/iroha-168/A…
nemo-855 Oct 20, 2021
0cd6bf9
rename directory entity -> uiModel
nemo-855 Oct 20, 2021
64146bf
FavoriteItemDescriptionのisSameAs修正
nemo-855 Oct 20, 2021
4ece3cf
FavoriteItemDescriptionViewModelを廃止してFavoriteItemDescriptionにidを持たせた(…
nemo-855 Oct 20, 2021
6c97dbd
FavoriteItemDiscription -> FavoriteItemDescription
nemo-855 Oct 24, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,77 @@ package com.nemo.androiduitraining.view.fragment.favorite
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.GridLayoutManager
import androidx.viewbinding.ViewBinding
import com.nemo.androiduitraining.R
import com.nemo.androiduitraining.databinding.FragmentFavoriteItemBinding
import com.nemo.androiduitraining.view.fragment.favorite.uiModel.item.*
import com.nemo.androiduitraining.viewModel.favorite.FavoriteItemViewModel
import com.xwray.groupie.GroupieAdapter
import com.xwray.groupie.viewbinding.BindableItem
import dagger.hilt.android.AndroidEntryPoint
import java.util.*

@AndroidEntryPoint
class FavoriteItemFragment : Fragment(R.layout.fragment_favorite_item) {
companion object {
fun newInstance() = FavoriteItemFragment()
}

private var _binding: FragmentFavoriteItemBinding? = null
private val binding: FragmentFavoriteItemBinding
get() = _binding!!
private val viewModel: FavoriteItemViewModel by viewModels()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
_binding = FragmentFavoriteItemBinding.bind(view)
val binding = FragmentFavoriteItemBinding.bind(view)

val adapter = CustomGroupieAdapter()
fetchClothsAndUpdateList(adapter)
setupRecycler(binding, adapter)
}

private fun fetchClothsAndUpdateList(adapter: CustomGroupieAdapter) {
viewModel.clothsLD.observe(viewLifecycleOwner) { cloths ->
adapter.updateList(cloths)
}
viewModel.fetchDisplayClothsList()
}

private fun setupRecycler(
binding: FragmentFavoriteItemBinding,
adapter: CustomGroupieAdapter
) {
val spanSize = adapter.itemList.maxOf { item -> (item as HasSpanSizeItem).spanSize }
val gridLayoutManager = GridLayoutManager(requireContext(), spanSize).also {
it.spanSizeLookup = CustomGridSpanSizeLookup(adapter)
}
binding.favoriteItemRecycler.layoutManager = gridLayoutManager
binding.favoriteItemRecycler.adapter = adapter
}

private class CustomGroupieAdapter : GroupieAdapter() {
private var _itemList: List<BindableItem<out ViewBinding>> = makeDefaultList()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これはなくせそう

val itemList: List<BindableItem<out ViewBinding>>
get() = _itemList

private fun makeDefaultList(): List<BindableItem<out ViewBinding>> = listOf(
FavoriteItemNoItem(),
FavoriteItemNowPopular()
)

fun updateList(newItems: List<FavoriteItemViewModel.DisplayClothsData>) {
val newItemList: List<BindableItem<out ViewBinding>> = newItems.map {
FavoriteItemDescription(displayData = it)
}
_itemList = makeDefaultList() + newItemList
updateAsync(_itemList)
}
}

override fun onDestroyView() {
super.onDestroyView()
_binding = null
private class CustomGridSpanSizeLookup(
private val adapter: CustomGroupieAdapter
) : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int) =
(adapter.getItem(position) as? HasSpanSizeItem)?.spanSize ?: 0
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.viewbinding.ViewBinding
import com.nemo.androiduitraining.R
import com.nemo.androiduitraining.databinding.FragmentFavoriteNewItemBinding
import com.nemo.androiduitraining.view.fragment.favorite.entity.FavoriteItemCell
import com.nemo.androiduitraining.view.fragment.favorite.entity.FavoriteNoBrandRegistered
import com.nemo.androiduitraining.view.fragment.favorite.entity.FavoriteNowPopular
import com.nemo.androiduitraining.view.fragment.favorite.uiModel.newItem.FavoriteNewItemCell
import com.nemo.androiduitraining.view.fragment.favorite.uiModel.newItem.FavoriteNewNoBrand
import com.nemo.androiduitraining.view.fragment.favorite.uiModel.newItem.FavoriteNewNowPopular
import com.nemo.androiduitraining.viewModel.favorite.FavoriteNewItemViewModel
import com.xwray.groupie.GroupieAdapter
import com.xwray.groupie.viewbinding.BindableItem
Expand Down Expand Up @@ -65,13 +65,13 @@ class FavoriteNewItemFragment : Fragment(R.layout.fragment_favorite_new_item) {
private var itemList: List<BindableItem<out ViewBinding>> = listOf()

private val defaultViewList = mutableListOf(
FavoriteNoBrandRegistered(),
FavoriteNowPopular()
FavoriteNewNoBrand(),
FavoriteNewNowPopular()
)

fun updateList(brandsList: List<FavoriteNewItemViewModel.BrandItem>) {
this.itemList = defaultViewList + brandsList.map {
FavoriteItemCell(
FavoriteNewItemCell(
brandName = it.name,
brandNameJapanese = it.nameJapanese
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.nemo.androiduitraining.view.fragment.favorite.uiModel.item

import android.view.View
import com.nemo.androiduitraining.R
import com.nemo.androiduitraining.databinding.FavoriteItemDescriptionBinding
import com.nemo.androiduitraining.viewModel.favorite.FavoriteItemViewModel
import com.xwray.groupie.Item
import com.xwray.groupie.viewbinding.BindableItem

class FavoriteItemDescription(
val displayData: FavoriteItemViewModel.DisplayClothsData
) : BindableItem<FavoriteItemDescriptionBinding>(), HasSpanSizeItem {
override val spanSize = 1
override fun bind(viewBinding: FavoriteItemDescriptionBinding, position: Int) {
viewBinding.displayClothsData = displayData
}

override fun getLayout() = R.layout.favorite_item_description

override fun initializeViewBinding(view: View): FavoriteItemDescriptionBinding {
return FavoriteItemDescriptionBinding.bind(view)
}

override fun isSameAs(other: Item<*>): Boolean {
return (other as? FavoriteItemDescription)?.displayData == this.displayData
}

override fun hasSameContentAs(other: Item<*>): Boolean {
return (other as? FavoriteItemDescription)?.displayData?.id == this.displayData.id
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.nemo.androiduitraining.view.fragment.favorite.uiModel.item

import android.view.View
import com.nemo.androiduitraining.R
import com.nemo.androiduitraining.databinding.FavoriteItemNoItemRegisteredBinding
import com.xwray.groupie.Item
import com.xwray.groupie.viewbinding.BindableItem

class FavoriteItemNoItem : BindableItem<FavoriteItemNoItemRegisteredBinding>(), HasSpanSizeItem {
override val spanSize = 3
override fun bind(viewBinding: FavoriteItemNoItemRegisteredBinding, position: Int) {
}

override fun getLayout() = R.layout.favorite_item_no_item_registered

override fun initializeViewBinding(view: View): FavoriteItemNoItemRegisteredBinding {
return FavoriteItemNoItemRegisteredBinding.bind(view)
}

/**現状FavoriteItemNoItemは一つしか表示しないので classが等しければ更新は不要*/
override fun isSameAs(other: Item<*>): Boolean {
return other is FavoriteItemNoItem
}

override fun hasSameContentAs(other: Item<*>): Boolean {
return isSameAs(other)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.nemo.androiduitraining.view.fragment.favorite.uiModel.item

import android.view.View
import com.nemo.androiduitraining.R
import com.nemo.androiduitraining.databinding.FavoriteItemNowPopularBinding
import com.xwray.groupie.Item
import com.xwray.groupie.viewbinding.BindableItem

class FavoriteItemNowPopular : BindableItem<FavoriteItemNowPopularBinding>(), HasSpanSizeItem {
override val spanSize = 3
override fun bind(viewBinding: FavoriteItemNowPopularBinding, position: Int) {
}

override fun getLayout() = R.layout.favorite_item_now_popular

override fun initializeViewBinding(view: View): FavoriteItemNowPopularBinding {
return FavoriteItemNowPopularBinding.bind(view)
}

override fun isSameAs(other: Item<*>): Boolean {
return other is FavoriteItemNowPopular
}

override fun hasSameContentAs(other: Item<*>): Boolean {
return isSameAs(other)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.nemo.androiduitraining.view.fragment.favorite.uiModel.item

interface HasSpanSizeItem {
val spanSize: Int
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.nemo.androiduitraining.view.fragment.favorite.entity
package com.nemo.androiduitraining.view.fragment.favorite.uiModel.newItem

import android.view.View
import com.nemo.androiduitraining.R
import com.nemo.androiduitraining.databinding.FavoriteNewItemItemCellBinding
import com.xwray.groupie.viewbinding.BindableItem

class FavoriteItemCell(
class FavoriteNewItemCell(
private val brandName: String,
private val brandNameJapanese: String
) : BindableItem<FavoriteNewItemItemCellBinding>() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.nemo.androiduitraining.view.fragment.favorite.entity
package com.nemo.androiduitraining.view.fragment.favorite.uiModel.newItem

import android.view.View
import com.nemo.androiduitraining.R
import com.nemo.androiduitraining.databinding.FavoriteNewItemNoBrandRegisteredBinding
import com.xwray.groupie.viewbinding.BindableItem

class FavoriteNoBrandRegistered : BindableItem<FavoriteNewItemNoBrandRegisteredBinding>() {
class FavoriteNewNoBrand : BindableItem<FavoriteNewItemNoBrandRegisteredBinding>() {
override fun bind(viewBinding: FavoriteNewItemNoBrandRegisteredBinding, position: Int) {
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.nemo.androiduitraining.view.fragment.favorite.entity
package com.nemo.androiduitraining.view.fragment.favorite.uiModel.newItem

import android.view.View
import com.nemo.androiduitraining.R
import com.nemo.androiduitraining.databinding.FavoriteNewItemNowPopularBinding
import com.xwray.groupie.viewbinding.BindableItem

class FavoriteNowPopular : BindableItem<FavoriteNewItemNowPopularBinding>() {
class FavoriteNewNowPopular : BindableItem<FavoriteNewItemNowPopularBinding>() {
override fun bind(viewBinding: FavoriteNewItemNowPopularBinding, position: Int) {
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package com.nemo.androiduitraining.viewModel.favorite

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import java.util.*
import javax.inject.Inject
import kotlin.random.Random

@HiltViewModel
class FavoriteItemViewModel @Inject constructor() : ViewModel() {
private val _clothsLD = MutableLiveData<List<DisplayClothsData>>()
val clothsLD: LiveData<List<DisplayClothsData>>
get() = _clothsLD

fun fetchDisplayClothsList() {
val displayList = mutableListOf<DisplayClothsData>()

for (i in 0..29) {
val data = when (Random.nextInt(4)) {
0 -> fullData
1 -> missPercentData
2 -> missCouponData
else -> missBothData
}
displayList.add(data)
}

_clothsLD.postValue(displayList)
}

private val fullData = DisplayClothsData(
id = UUID.randomUUID().toString(),
itemImage = "https://shop.adidas.jp/photo/GN/GN3458/z-GN3458-on_model-standard_view.jpg",
discountPercent = 50,
couponPrice = 300,
itemName = "アディパン",
itemGenre = "いかつい",
itemPrice = 3000
)

private val missPercentData = DisplayClothsData(
id = UUID.randomUUID().toString(),
itemImage = "https://shop.adidas.jp/photo/GN/GN3458/z-GN3458-on_model-standard_view.jpg",
discountPercent = null,
couponPrice = 300,
itemName = "アディパン",
itemGenre = "いかつい",
itemPrice = 3000
)

private val missCouponData = DisplayClothsData(
id = UUID.randomUUID().toString(),
itemImage = "https://shop.adidas.jp/photo/GN/GN3458/z-GN3458-on_model-standard_view.jpg",
discountPercent = 50,
couponPrice = null,
itemName = "アディパン",
itemGenre = "いかつい",
itemPrice = 3000
)

private val missBothData = DisplayClothsData(
id = UUID.randomUUID().toString(),
itemImage = "https://shop.adidas.jp/photo/GN/GN3458/z-GN3458-on_model-standard_view.jpg",
discountPercent = null,
couponPrice = null,
itemName = "アディパン",
itemGenre = "いかつい",
itemPrice = 3000
)

data class DisplayClothsData(
val id: String,
val itemImage: String,
val discountPercent: Int?,
val couponPrice: Int?,
val itemName: String,
val itemGenre: String,
val itemPrice: Int
) {
fun hasDiscountPercent() = discountPercent != null
fun hasCouponPrice() = couponPrice != null
fun makePriceText(price: Int) = "¥$price"
fun makeCouponPrice(couponPrice: Int?) = "¥${couponPrice}クーポン"
fun makeCouponDiscountPercent(discountPercent: Int?) = "$discountPercent%OFF"
}
}