Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

66 changes: 66 additions & 0 deletions .idea/other.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

124 changes: 124 additions & 0 deletions app/src/main/java/com/example/ssul/FavoritesFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,16 @@ import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.ssul.adapter.StoreAdapter
import com.example.ssul.model.StoreModel
import com.example.ssul.viewmodel.DegreeViewModel
import com.example.ssul.viewmodel.FavoriteViewModel
import com.example.ssul.viewmodel.FilterViewModel
import com.example.ssul.viewmodel.StoreViewModel
import kotlinx.coroutines.launch

//class FavoritesFragment : Fragment() {
Expand Down Expand Up @@ -236,6 +241,21 @@ import kotlinx.coroutines.launch


class FavoritesFragment : Fragment() {
// UI
private lateinit var degreeTextView: TextView
private lateinit var setDegreeButton: ImageView
private lateinit var storeAdapter: StoreAdapter
private lateinit var storeList: RecyclerView
private lateinit var groupFilterChip: TextView
private lateinit var dateFilterChip: TextView
private lateinit var efficiencyFilterChip: TextView
private lateinit var partnerFilterChip: TextView

// ViewModel
private lateinit var degreeViewModel: DegreeViewModel
private lateinit var storeViewModel: StoreViewModel
private lateinit var favoriteViewModel: FavoriteViewModel
private lateinit var filterViewModel: FilterViewModel

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
Expand All @@ -248,6 +268,110 @@ class FavoritesFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

setupViews(view)
setupViewModels()
setupAdapters()

// 학과 정보 관찰 및 업데이트
degreeViewModel.selectedDepartment.observe(viewLifecycleOwner) { degree ->
degreeTextView.text = degree
}

// 학과 수정 버튼 클릭
setDegreeButton.setOnClickListener {
startActivity(Intent(requireContext(), StartActivity::class.java))
}

// 가게 데이터 관찰 및 업데이트
storeViewModel.storeItems.observe(viewLifecycleOwner) { items ->
storeAdapter.updateItems(items)
}

// 즐겨찾기 상태 관찰 및 업데이트
favoriteViewModel.favoriteState.observe(viewLifecycleOwner) { favorites ->
storeAdapter.updateFavorites(favorites)
}

// 필터 상태 관찰 및 UI 업데이트
filterViewModel.filters.observe(viewLifecycleOwner) { filters ->
updateChipUI(groupFilterChip, filters.groupFilter)
updateChipUI(dateFilterChip, filters.dateFilter)
updateChipUI(efficiencyFilterChip, filters.efficiencyFilter)
updateChipUI(partnerFilterChip, filters.partnerFilter)
storeViewModel.applyFilters(filters)
}
onFilterButtonClicked()

// 학과 클릭 로직 처리 + 즐겨찾기 가게 필터링 + 즐겨찾기 토글(아이템 삭제)
}

private fun setupViews(view: View) {
degreeTextView = view.findViewById(R.id.degree_text)
setDegreeButton = view.findViewById(R.id.set_degree_button)
storeList = view.findViewById(R.id.store_list)
storeList.layoutManager = LinearLayoutManager(requireContext())
groupFilterChip = view.findViewById(R.id.filter_group_button)
dateFilterChip = view.findViewById(R.id.filter_date_button)
efficiencyFilterChip = view.findViewById(R.id.filter_efficiency_button)
partnerFilterChip = view.findViewById(R.id.filter_partner_button)
}

private fun setupViewModels() {
degreeViewModel = ViewModelProvider(this)[DegreeViewModel::class.java]
storeViewModel = ViewModelProvider(this)[StoreViewModel::class.java]
favoriteViewModel = ViewModelProvider(this)[FavoriteViewModel::class.java]
filterViewModel = ViewModelProvider(this)[FilterViewModel::class.java]

Choose a reason for hiding this comment

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

FilterViewModel의 역할이 무엇인가요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

4가지 필터(단체, 데이트, 가성비, 제휴)의 체크 상태를(true, false) 관리하는 뷰모델입니다

}

private fun setupAdapters() {
storeAdapter = StoreAdapter(
storeItems = storeViewModel.storeItems.value ?: mutableListOf(),
favoriteItems = favoriteViewModel.favoriteState.value ?: emptyList(),
onFavoriteClicked = { storeId ->

Choose a reason for hiding this comment

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

맨 처음에는 로딩이 다 되지 않았으니까 아이템들이 항상 빈 리스트로 들어가게 되지 않을까요?

favoriteViewModel.toggleFavorite(storeId)
},
onStoreClicked = { storeId ->
moveToStoreActivity(storeId)
},
isFavoriteMode = true
)
storeList.adapter = storeAdapter
}

// 필터링 칩 UI 업데이트
private fun updateChipUI(chip: TextView, isSelected: Boolean) {
if (isSelected) {
chip.setBackgroundResource(R.drawable.filter_clicked)
chip.setTextColor(ContextCompat.getColor(requireContext(), R.color.white))
} else {
chip.setBackgroundResource(R.drawable.filter_non_clicked)
chip.setTextColor(ContextCompat.getColor(requireContext(), R.color.black))
}
}

// 필터 버튼 클릭 시 ViewModel에 상태 전달
private fun onFilterButtonClicked() {
groupFilterChip.setOnClickListener {
filterViewModel.toggleFilter("group")
}
dateFilterChip.setOnClickListener {
filterViewModel.toggleFilter("date")
}
efficiencyFilterChip.setOnClickListener {
filterViewModel.toggleFilter("efficiency")
}
partnerFilterChip.setOnClickListener {
filterViewModel.toggleFilter("partner")
}
}

private fun moveToStoreActivity(storeId: Int) {
val selectedStore = storeViewModel.storeItems.value?.find { it.id == storeId }

val intent = Intent(requireContext(), StoreActivity::class.java).apply {
putExtra("storeId", storeId)
putExtra("storeImageUrl", selectedStore?.imageUrl ?: "")
}
startActivity(intent)
}
}
8 changes: 5 additions & 3 deletions app/src/main/java/com/example/ssul/HomeFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -428,11 +428,10 @@ class HomeFragment : Fragment() {
updateChipUI(partnerFilterChip, filters.partnerFilter)
storeViewModel.applyFilters(filters)
}

onFilterButtonClicked()

// 필터 적용
// 즐겨찾기 업데이트 안 됨 + 즐겨찾기 메시지 박스 안 뜸

// 즐겨찾기 업데이트 + 즐겨찾기 메시지 박스 표시 + 검색 기능
}

private fun setupViews(view: View) {
Expand Down Expand Up @@ -492,8 +491,11 @@ class HomeFragment : Fragment() {
}

private fun moveToStoreActivity(storeId: Int) {
val selectedStore = storeViewModel.storeItems.value?.find { it.id == storeId }

val intent = Intent(requireContext(), StoreActivity::class.java).apply {
putExtra("storeId", storeId)
putExtra("storeImageUrl", selectedStore?.imageUrl ?: "")
}
startActivity(intent)
}
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/com/example/ssul/SelectCollegeFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ import android.widget.Spinner
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.navigation.fragment.findNavController
import com.example.ssul.viewmodel.DepartmentRegisterViewModel
import com.example.ssul.viewmodel.DegreeViewModel

class SelectCollegeFragment : Fragment() {

private val viewModel: DepartmentRegisterViewModel by activityViewModels()
private val viewModel: DegreeViewModel by activityViewModels()

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ import android.widget.ArrayAdapter
import android.widget.Spinner
import androidx.fragment.app.activityViewModels
import androidx.navigation.fragment.findNavController
import com.example.ssul.viewmodel.DepartmentRegisterViewModel
import com.example.ssul.viewmodel.DegreeViewModel

class SelectDepartmentFragment : Fragment() {

private val viewModel: DepartmentRegisterViewModel by activityViewModels()
private val viewModel: DegreeViewModel by activityViewModels()

private val departmentMap = mapOf(
"IT대학" to listOf(
Expand Down
Loading