Skip to content

Commit

Permalink
✨ Feat: 초대할 친구 기능 구현
Browse files Browse the repository at this point in the history
- 초대할 친구 리사이클러뷰 adapter 연결
- 친구 선택/해제에 따른 처리

Related to: #347
  • Loading branch information
nahy-512 committed Jan 8, 2025
1 parent 4caa8fe commit 8fae907
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.mongmong.namo.presentation.ui.community.moim.schedule

import android.text.Html
import android.util.Log
import androidx.activity.viewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.mongmong.namo.R
import com.mongmong.namo.databinding.ActivityFriendInviteBinding
import com.mongmong.namo.presentation.config.BaseActivity
import com.mongmong.namo.presentation.ui.community.moim.schedule.adapter.FriendInvitePreparatoryRVAdapter
import com.mongmong.namo.presentation.ui.community.moim.schedule.adapter.FriendInviteRVAdapter
import dagger.hilt.android.AndroidEntryPoint

Expand All @@ -14,7 +16,8 @@ class FriendInviteActivity : BaseActivity<ActivityFriendInviteBinding>(R.layout.

private val viewModel: FriendInviteViewModel by viewModels()

private lateinit var friendAdapter: FriendInviteRVAdapter
private lateinit var friendToInviteAdapter: FriendInvitePreparatoryRVAdapter
private lateinit var allFriendAdapter: FriendInviteRVAdapter

override fun setup() {
binding.viewModel = viewModel
Expand All @@ -36,31 +39,62 @@ class FriendInviteActivity : BaseActivity<ActivityFriendInviteBinding>(R.layout.
binding.friendInviteSelectedNumTv.text = Html.fromHtml(String.format(resources.getString(R.string.moim_schedule_friend_invite_selected_num), viewModel.friendToInviteList.value?.size, viewModel.friendList.value?.size))
}

private fun setAdapter() {
friendAdapter = FriendInviteRVAdapter()
// 초대할 친구 어댑터 설정
private fun setFriendInvitePreparatoryAdapter() {
friendToInviteAdapter = FriendInvitePreparatoryRVAdapter()
binding.friendInvitePreparatoryRv.apply {
adapter = friendToInviteAdapter
layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
}

friendToInviteAdapter.setItemClickListener(object : FriendInvitePreparatoryRVAdapter.MyItemClickListener {
override fun onDeleteBtnClick(position: Int) {
val friendToDelete = viewModel.friendToInviteList.value!![position]
// 초대할 친구 목록에서 삭제
viewModel.updateSelectedFriend(false, friendToDelete)
}
})
}

// 모든 친구 어댑터 설정
private fun setAllFriendAdapter() {
allFriendAdapter = FriendInviteRVAdapter()
binding.friendInviteListRv.apply {
adapter = friendAdapter
adapter = allFriendAdapter
layoutManager = LinearLayoutManager(context)
}

friendAdapter.setItemClickListener(object : FriendInviteRVAdapter.MyItemClickListener {
override fun onInviteButtonClick(position: Int) {
//TODO: 친구 초대 진행
allFriendAdapter.setItemClickListener(object : FriendInviteRVAdapter.MyItemClickListener {
override fun onInviteButtonClick(isSelected: Boolean, position: Int) {
// 초대할 친구 목록에 추가
Log.d("FriendInviteACT", "onInviteButtonClick - isSelected: $isSelected, position: $position")
viewModel.updateSelectedFriend(isSelected, viewModel.friendList.value!![position])
}

override fun onItemClick(position: Int) {
//TODO: 친구 정보 화면으로 이동?
//
}
})
}

private fun initObserve() {
viewModel.friendList.observe(this) {
// 초대할 친구
viewModel.friendToInviteList.observe(this) {
Log.d("FriendInviteACT", "friendToInviteList: $it")
if (it.isNotEmpty()) {
setAdapter()
friendAdapter.addFriend(it)
setFriendInvitePreparatoryAdapter()
friendToInviteAdapter.addFriend(it)
setFriendSelectedNum()
}
}

// 모든 친구
viewModel.friendList.observe(this) {
if (it.isNotEmpty()) {
setAllFriendAdapter()
}
allFriendAdapter.addFriend(it)
setFriendSelectedNum()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ class FriendInviteViewModel @Inject constructor(
val friendList: LiveData<List<Friend>> = _friendList

// 초대할 친구 목록
private val _friendToInviteList = MutableLiveData<List<Friend>>(emptyList())
val friendToInviteList: LiveData<List<Friend>> = _friendToInviteList
private val _friendToInviteList = MutableLiveData<ArrayList<Friend>>(ArrayList())
val friendToInviteList: LiveData<ArrayList<Friend>> = _friendToInviteList

init {
getFriends()
Expand All @@ -32,4 +32,11 @@ class FriendInviteViewModel @Inject constructor(
_friendList.value = getFriendsUseCase.execute()
}
}

fun updateSelectedFriend(isSelected: Boolean, friend: Friend) {
val tempFriendArr = _friendToInviteList.value!!
if (isSelected) tempFriendArr.add(friend)
else tempFriendArr.remove(friend)
_friendToInviteList.value = tempFriendArr
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.mongmong.namo.presentation.ui.community.moim.schedule.adapter

import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.mongmong.namo.databinding.ItemFriendToInviteBinding
import com.mongmong.namo.domain.model.Friend

class FriendInvitePreparatoryRVAdapter: RecyclerView.Adapter<FriendInvitePreparatoryRVAdapter.ViewHolder>(){

private var friendList = emptyList<Friend>()
private lateinit var mItemClickListener: MyItemClickListener

fun setItemClickListener(itemClickListener: MyItemClickListener) {
mItemClickListener = itemClickListener
}

@SuppressLint("NotifyDataSetChanged")
fun addFriend(friendList: List<Friend>) {
this.friendList = friendList
notifyDataSetChanged()
}

interface MyItemClickListener {
fun onDeleteBtnClick(position: Int)
}

override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
val binding: ItemFriendToInviteBinding = ItemFriendToInviteBinding.inflate(
LayoutInflater.from(viewGroup.context), viewGroup, false
)

return ViewHolder(binding)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(friendList[position])
holder.apply {
// 삭제 버튼 클릭
binding.imageDeleteBtn.setOnClickListener {
mItemClickListener.onDeleteBtnClick(position)
}
}
}

override fun getItemCount(): Int = friendList.size

inner class ViewHolder(val binding: ItemFriendToInviteBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(friend: Friend) {
binding.friend = friend
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class FriendInviteRVAdapter: RecyclerView.Adapter<FriendInviteRVAdapter.ViewHold
}

interface MyItemClickListener {
fun onInviteButtonClick(position: Int)
fun onInviteButtonClick(isSelected: Boolean, position: Int)
fun onItemClick(position: Int)
}

Expand All @@ -44,15 +44,14 @@ class FriendInviteRVAdapter: RecyclerView.Adapter<FriendInviteRVAdapter.ViewHold
}
// 초대 버튼 클릭
binding.itemFriendInviteBtn.setOnClickListener {
mItemClickListener.onInviteButtonClick(position)
mItemClickListener.onInviteButtonClick(binding.itemFriendInviteBtn.isChecked, position)
}
}
}

override fun getItemCount(): Int = friendList.size

inner class ViewHolder(val binding: ItemFriendInviteBinding) : RecyclerView.ViewHolder(binding.root) {
//TODO: 실제 친구 데이터로 변경
fun bind(friend: Friend) {
binding.friend = friend
}
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/layout/activity_friend_invite.xml
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:visibility="@{viewModel.friendToInviteList.empty ? View.GONE : View.VISIBLE}"
android:layout_marginHorizontal="25dp"
android:orientation="vertical"
app:layout_constraintTop_toBottomOf="@id/friend_invite_search_btn">
Expand All @@ -116,6 +117,7 @@
style="@style/content_bold"/>

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/friend_invite_preparatory_rv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/layout/item_friend_to_invite.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" >

<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/image_iv"
android:layout_width="match_parent"
Expand Down

0 comments on commit 8fae907

Please sign in to comment.