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

お気に入り画面のブランドタブ作成 #28

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
@@ -1,29 +1,81 @@
package com.nemo.androiduitraining.view.fragment.favorite

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.viewbinding.ViewBinding
import com.nemo.androiduitraining.R
import com.nemo.androiduitraining.databinding.FragmentFavoriteBrandBinding
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.viewModel.favorite.FavoriteBrandViewModel
import com.xwray.groupie.GroupieAdapter
import com.xwray.groupie.viewbinding.BindableItem

class FavoriteBrandFragment : Fragment(R.layout.fragment_favorite_brand) {
companion object {
fun newInstance() = FavoriteBrandFragment()
}

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

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
_binding = FragmentFavoriteBrandBinding.bind(view)
val binding = FragmentFavoriteBrandBinding.bind(view).also {
it.lifecycleOwner = viewLifecycleOwner
it.viewModel = viewModel
}
val adapter = GroupieCustomAdapter()
setupRecycler(binding, adapter)
fetchBrandsItemAndUpdateList(adapter)
}

override fun onDestroyView() {
super.onDestroyView()
_binding = null
private fun setupRecycler(binding: FragmentFavoriteBrandBinding, adapter: GroupieCustomAdapter) {
val layoutManager = LinearLayoutManager(requireContext())

binding.brandRecycler.also {
it.layoutManager = layoutManager
it.addItemDecoration(createRecyclerDiver(layoutManager))
it.adapter = adapter
}
}
private fun createRecyclerDiver(layoutManager: LinearLayoutManager): DividerItemDecoration {
val dividerDrawable = ContextCompat.getDrawable(requireContext(), R.drawable.fragment_favorite_new_item_divider)
return DividerItemDecoration(requireContext(), layoutManager.orientation).apply {
if (dividerDrawable != null) {
this.setDrawable(dividerDrawable)
}
}
}

private fun fetchBrandsItemAndUpdateList(adapter: GroupieCustomAdapter) {
viewModel.brandLD.observe(viewLifecycleOwner) { brands ->
adapter.updateList(brands)
}
viewModel.fetchBrandItems()
}

private class GroupieCustomAdapter : GroupieAdapter() {
private var itemList: List<BindableItem<out ViewBinding>> = listOf()

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

fun updateList(brandsList: List<FavoriteBrandViewModel.BrandTabBrandItem>) {
this.itemList = defaultViewList + brandsList.map {
FavoriteItemCell(
brandName = it.name,
brandNameJapanese = it.nameJapanese
)
}
update(this.itemList)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ class FavoriteNewItemFragment : Fragment(R.layout.fragment_favorite_new_item) {
FavoriteNowPopular()
)

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

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

class FavoriteBrandItemCell : BindableItem<FavoriteBrandItemCellBinding>() {
override fun bind(viewBinding: FavoriteBrandItemCellBinding, position: Int) {

}

override fun getLayout() = R.layout.favorite_brand_item_cell

override fun initializeViewBinding(view: View): FavoriteBrandItemCellBinding {
return FavoriteBrandItemCellBinding.bind(view)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.nemo.androiduitraining.view.fragment.favorite.entity

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

class FavoriteBrandNoBrandRegistered : BindableItem<FavoriteBrandNoBrandRegisteredBinding>() {
override fun bind(viewBinding: FavoriteBrandNoBrandRegisteredBinding, position: Int) {

}

override fun getLayout() = R.layout.favorite_brand_no_brand_registered

override fun initializeViewBinding(view: View): FavoriteBrandNoBrandRegisteredBinding {
return FavoriteBrandNoBrandRegisteredBinding.bind(view)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.nemo.androiduitraining.view.fragment.favorite.entity

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

class FavoriteBrandNowPopular : BindableItem<FavoriteBrandNowPopularBinding>() {
override fun bind(viewBinding: FavoriteBrandNowPopularBinding, position: Int) {

}

override fun getLayout() = R.layout.favorite_brand_now_popular

override fun initializeViewBinding(view: View): FavoriteBrandNowPopularBinding {
return FavoriteBrandNowPopularBinding.bind(view)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
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 javax.inject.Inject

@HiltViewModel
class FavoriteBrandViewModel @Inject constructor(): ViewModel() {
private val _brandsLD = MutableLiveData<List<BrandTabBrandItem>>()
val brandLD: LiveData<List<BrandTabBrandItem>>
get() = _brandsLD

fun fetchBrandItems() {
val brandsList = mutableListOf<BrandTabBrandItem>()
for (i in 0..29) {
brandsList.add(
BrandTabBrandItem("uniqlo", "ユニクロ")
)
}
_brandsLD.postValue(brandsList)
}

data class BrandTabBrandItem(
val name: String,
val nameJapanese: String
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,26 @@ package com.nemo.androiduitraining.viewModel.favorite
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.viewbinding.ViewBinding
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.xwray.groupie.viewbinding.BindableItem
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject

@HiltViewModel
class FavoriteNewItemViewModel @Inject constructor() : ViewModel() {
private val _brandsLD = MutableLiveData<List<BrandItem>>()
val brandLD: LiveData<List<BrandItem>>
private val _brandsLD = MutableLiveData<List<ItemTabBrandItem>>()
val brandLD: LiveData<List<ItemTabBrandItem>>
get() = _brandsLD

fun fetchBrandItems() {
val brandsList = mutableListOf<BrandItem>()
val brandsList = mutableListOf<ItemTabBrandItem>()
for (i in 0..29) {
brandsList.add(
BrandItem("ほげほげ", "フガフガ")
ItemTabBrandItem("ほげほげ", "フガフガ")
)
}
_brandsLD.postValue(brandsList)
}

data class BrandItem(
data class ItemTabBrandItem(
val name: String,
val nameJapanese: String
)
Expand Down
83 changes: 83 additions & 0 deletions app/src/main/res/layout/favorite_brand_item_cell.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/side_margin_16"
android:layout_marginEnd="@dimen/side_margin_16"
xmlns:app="http://schemas.android.com/apk/res-auto">

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="h,5:1">

<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline_vertical1"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintGuide_percent="0.1"
android:orientation="vertical"/>

<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline_vertical2"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintGuide_percent="0.9"
android:orientation="vertical"/>

<ImageView
android:id="@+id/favorite_image"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/guideline_vertical1"
android:src="@drawable/ic_baseline_favorite_24"
android:layout_margin="8dp"
app:tint="@color/text_gray"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintHorizontal_bias="1"
android:contentDescription="@string/image"/>

<TextView
android:id="@+id/item_name_tv"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintStart_toStartOf="@id/guideline_vertical1"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="@id/guideline_vertical2"
app:layout_constraintBottom_toTopOf="@id/brand_tv"
android:gravity="start|bottom"
android:textColor="@color/black"
app:layout_constraintHorizontal_bias="1"/>
<TextView
android:id="@+id/brand_tv"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintStart_toStartOf="@id/guideline_vertical1"
app:layout_constraintTop_toBottomOf="@id/item_name_tv"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/guideline_vertical2"
android:gravity="start|top"
android:textColor="@color/text_gray"
app:layout_constraintHorizontal_bias="1"/>

<ImageView
android:id="@+id/arrow_image"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintStart_toStartOf="@id/guideline_vertical2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:src="@drawable/ic_baseline_keyboard_arrow_right_24"
app:tint="@color/text_gray"
app:layout_constraintHorizontal_weight="1"
android:contentDescription="@string/image" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
57 changes: 57 additions & 0 deletions app/src/main/res/layout/favorite_brand_no_brand_registered.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="h,5:3"
android:background="@color/light_gray">

<ImageView
android:id="@+id/no_brand_image"
android:layout_width="0dp"
android:layout_height="0dp"
android:src="@drawable/ic_android_black_24dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/no_brand_tv_main"
android:contentDescription="@string/image"/>
<TextView
android:id="@+id/no_brand_tv_main"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/no_brand_image"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/no_brand_tv_sub"
android:text="@string/no_favorite_brand"
android:gravity="center"
android:textColor="@color/black"
android:textStyle="bold"
android:textSize="16sp"
android:layout_marginBottom="16dp"/>

<TextView
android:id="@+id/no_brand_tv_sub"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/no_brand_tv_main"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:text="@string/brand_tab_no_brand_sub_text"
android:gravity="center"
android:textColor="@color/black"
android:layout_marginBottom="32dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>