[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액티비티에 보여진다.

여자 회원.png

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

남자 회원.png


728x90