[Android] 매칭 로직 생성. 반대 성별 User 데이터 가져오기

728x90

🙋🏻‍♀️ 매칭 로직 만들기

🟦 새로운 유저 정보 넣기

▶️ CardStackView에서 사용자가 왼쪽/오른쪽 Swiped 대한 이벤트 처리

  • 왼쪽 Swiped 의 경우, X 표시 (don’t liked)
  • 오른쪽 Swiped 의 경우, O 표시 (liked)
  • + ) 모든 사용자를 보여줬다면, 다시 처음부터 회원들을 보여줄 것.
  • → 이를 위해서 userCount 변수 선언해서 Swiped 전체 턴 당, 누적합을 구하고 이 값이 모든 UserDataList 개수와 동일한 경우 다시 처음부터 회원 정보를 불러오도록 getUserData() 메소드 재호출한다.
val cardStackView = findViewById<CardStackView>(R.id.cardStackView)

        manager = CardStackLayoutManager(baseContext, object : CardStackListener {
            override fun onCardDragging(direction: Direction?, ratio: Float) {

            }

            override fun onCardSwiped(direction: Direction?) {
                if(direction == Direction.Right) { //오른쪽 넘김 시
                    Toast.makeText(this@MainActivity, "right", Toast.LENGTH_LONG).show()
                }

                if(direction == Direction.Left) { //오른쪽 넘김 시
                    Toast.makeText(this@MainActivity, "left", Toast.LENGTH_LONG).show()
                }

                userCount = userCount + 1

                if(userCount == usersDataList.count()) { //모두 다 넘겼으면
                    getUserDataList() //다시 처음부터 user 리스트 받아오고
                    Toast.makeText(this@MainActivity, "다시 시작", Toast.LENGTH_LONG).show()

                }
            }

            override fun onCardRewound() {

            }

            override fun onCardCanceled() {

            }

            override fun onCardAppeared(view: View?, position: Int) {

            }

            override fun onCardDisappeared(view: View?, position: Int) {

            }

        })

        cardStackAdapter = CardStackAdapter(baseContext, usersDataList)
        cardStackView.layoutManager = manager
        cardStackView.adapter = cardStackAdapter

        getUserDataList() //실행
    }

🟦 현재 로그인한 User의 성별과 다른 성별의 User 불러오기

▶️ 나와 다른 성별의 User 회원 정보들을 불러오기

  • 1) 현재 로그인한 User의 성별을 알아야 함
  • 2) 그 성별과 다른 성별의 User에 한해서만 List 에 선별해서 화면에 불러오면 된다.

🟧 MainActivity.kt

  • 1) 현재 로그인한 User의 성별 데이터를 불러올 것
  • getMyUserData() 메소드 내부에서 처리
//DB에서 현재 로그인한 사용자의 회원 정보 받아오는 부분
    private fun getMyUserData() {
        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {

                //데이터 가져와서
                val data = dataSnapshot.getValue(UserDataModel::class.java)
                Log.d("test", data?.gender.toString())

                //현재 User 의 gender 정보
                currentUserGender = data?.gender.toString()

                // 내부적으로 반대의 성별 회원 데이터를 불러오도록 작성할 것
                getUserDataList(currentUserGender)
            }

            override fun onCancelled(databaseError: DatabaseError) {
                // Getting Post failed, log a message

            }
        }
        FirebaseRef.userInfoRef.child(uid).addValueEventListener(postListener)
    }
  • 2) 현재 로그인한 User의 값을 currentUserGender 변수에 담아둔 뒤, 이 값을 인수로 갖고 내부적으로 이 값의 gender와 다른 값을 갖는 User들을 UserDataList에 add() 처리하는 로직을 갖도록 만든다.
  • getUserDataList(currentUserGender) 메소드 내부에서 처리
//DB에서 회원정보 받아오는 부분
    private fun getUserDataList(currentUserGender : String) {
        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {

                for(dataModel in dataSnapshot.children) {

                    val user = dataModel.getValue(UserDataModel::class.java)

                    if(user?.gender.toString().equals(currentUserGender)) {
                        //만약 같은 성별인 경우

                    }else{ //다른 성별인 경우
                        usersDataList.add(user!!) //이 경우에만 UserList에 담음
                    }

                }

                cardStackAdapter.notifyDataSetChanged()
            }

            override fun onCancelled(databaseError: DatabaseError) {
                // Getting Post failed, log a message
                Log.w("test", "loadPost:onCancelled", databaseError.toException())
            }
        }

        FirebaseRef.userInfoRef.addValueEventListener(postListener)
    }

}

🟧 실행화면

1) 현재 로그인한 User의 gender 값이 W(oman)이면 gender가 M(en)인 회원들만 main액티비티에 보여진다.

2) 현재 로그인한 User의 gender 값이 M(an)이면 gender가 W(oman)인 회원들만 main 액티비티에 보여진다.


728x90