본문 바로가기

개발 노트/Kotlin

[Android/Kotlin] 파이어베이스 CRUD 만들기 (3) - 사용자 리스트 확인

저번시간에 이어서 이번엔 파이어베이스 데이터베이스에 등록된 사용자정보를 리스트에 보여주는 것을 만들어볼것이다

 

먼저 UserDao에 들어가서 조회 할수있는 함수를 추가해준다

	// 조회 함수
    fun getUserList() : Query?{
        return databaseReference
    }
}

UserDao.kt

 

 

 

사용자 등록 레이아웃을 생성해준다

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_margin="10dp"
    android:background="#EFEBE9"
    app:cardCornerRadius="5dp"
    app:cardElevation="10dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/name_text"
            android:text="이름"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:textSize="25sp"
            android:textStyle="bold"/>

        <TextView
            android:id="@+id/age_text"
            android:text="나이"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:textSize="25sp"
            android:textStyle="bold"/>


    </LinearLayout>

</androidx.cardview.widget.CardView>

user_layout.xml

user_layout.xml

 

 

 

 

그 다음에 데이터(사용자목록)과 user_layout.xml을 연결해줄 어뎁터를 생성해주겠다

package com.example.firebasecrud

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.google.firebase.database.core.Context


// ArrayList에는 User클래스타입의 변수 넣음
class UserAdapter(private val context : Context, private val userList : ArrayList<User>): RecyclerView.Adapter<UserAdapter.UserViewHolder>(){


    // user_layout.xml의 뷰객체를 만들 클래스 추가
    class UserViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView){

        // itemView의 값을 받아서 객체생성
        val nameText : TextView = itemView.findViewById(R.id.name_text)
        val ageText : TextView = itemView.findViewById(R.id.age_text)

    }


    // 화면 연결
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
        // user_layout과 연결
        val view = LayoutInflater.from(parent.context).inflate(R.layout.user_layout ,parent, false)

        // 위에서 만든 UserViewHolder생성자에 view 전달
        return UserViewHolder(view)

    }


    // 데이터 설정(연결)
    override fun onBindViewHolder(holder: UserViewHolder, position: Int) {

        // userList에 담긴 위치의값을 user변수에 담아서
        val user : User = userList[position]

        // user에 있는 userName값을 nameText에 담음 / user에 있는 userAge값을 ageText에 담음
        holder.nameText.text = user.userName
        holder.ageText.text = user.userAge

    }


    // 값 개수 리턴
    override fun getItemCount(): Int {

        // 리스트값 리턴
        return userList.size
    }

}

UserAdapter.kt

OnCreateViewHolder = 화면 연결

OnBindViewHolder = 데이터 연결

getItemCount = 값 개수 리턴

 

 

 

 

 

이제 사용자 목록을 보여줄화면을 디자인해준다

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".UserListActivity">
    
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

activity_user_list.xml

 

activity_user_list.xml

 

그냥 recyclerview만 적용해주었기 때문에 이렇게 레이아웃이 보여지는것을 볼수있다

 

 

 

 

이제 이 레이아웃에 해당하는 Activity를 생성해주겠다

똑같이 viewbinding을 먼저 적용해서 틀을 만들어주고, 아래와 같이 코드를 써준다

package com.example.firebasecrud

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.firebasecrud.databinding.ActivityUserListBinding
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.ValueEventListener

class UserListActivity : AppCompatActivity() {

    lateinit var binding : ActivityUserListBinding

    // UserDao 데이터베이스 객체 추가
    lateinit var dao : UserDao

    // UserAdpater 클래스 객체 추가
    lateinit var adpter : UserAdapter

    // ArrayList 객체 추가
    lateinit var userList : ArrayList<User>


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityUserListBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 선언한 객체들 초기화
        userList = ArrayList()  // userList 초기화
        dao = UserDao()         // dao 초기화
        adpter = UserAdapter(this,userList)     // adpter 초기화   // UseAdpater에 Context와 userList를 전달
        // recyclerview 초기화
        binding.recyclerView.layoutManager = LinearLayoutManager(this)
        binding.recyclerView.adapter = adpter          // recyclerView의 adapter속성에 UserAdapter의 객체 적용


        // 사용자 정보 가져옴
        getUserList()

    }



    // 사용자 정보 가져오는 함수
    private fun getUserList() {

        dao.getUserList()?.addValueEventListener(object  : ValueEventListener{

            // 값이 변경됐을때 호출되는 함수
            override fun onDataChange(snapshot: DataSnapshot) {

                for (dataSnapshot in snapshot.children){

                    val user = dataSnapshot.getValue(User::class.java)

                    // 키값 가져오기
                    val key = dataSnapshot.key

                    // 사용자 정보에 키값 담기
                    user?.userKey = key.toString()

                    // 리스트에 담기
                    if (user != null){
                        userList.add(user)
                    }
                }

                // 데이터 적용
                adpter.notifyDataSetChanged()
            }

            
            // 데이터 읽기 실패했을때 호출되는 함수
            override fun onCancelled(error: DatabaseError) {

            }

        })

    }
}

 

 

onDataChange = 값이 변경됐을때 호출

onCancelled = 데이터 읽기 실패했을때 호출

 

 

onDataChange에 해당하는 함수를 설명해보자면,

 

addValueEventListner를 통해서 사용자 목록을 가져온다

snapshot.children이 사용자 목록인데 snapshot.children을 통해 사용자정보가 dataSnapshot에 담긴다

그 담긴 데이터를 User::class.java 타입으로 만들고 그 값을 user변수에 담는다

dataSnapshot.key를 통해서 파이어베이스에 있는 사용자정보의 key값을 가져올수있다 (이 key값을 텅해서 사용정보 수정 및 삭제를 할수있다)

이제 이 key값을 사용자의 userKey(파이어베이스에 있는 userKey 데이터) 에 넣어준다 

그리고 user가 null이 아니면 userList에 user(사용자정보)를 담을것이고, adapter.notifyDataSetChanged()를 통해서 화면에 사용자 정보가 보여지게 된다

 

 

 

이제 activity_main.xml 으로 돌아가서 사용자 목록으로 이동할수있는 버튼을 하나 더 추가해줄것이다

<Button
    android:id="@+id/list_btn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:text="사용자 목록"
    android:textSize="25sp"/>

 

 activity_main.xml

 

activity_main.xml

 

 

 

 

마지막으로로 MainActivity로 돌아가서 사용자 목록 버튼을 눌렀을때 작동하도록 해보겠다

// 사용자 목록 버튼 클릭했을때
binding.listBtn.setOnClickListener {

    val intent : Intent = Intent(this@MainActivity, UserListActivity::class.java)
    startActivity(intent)
}

MainActivity.kt

 

 

 

 

최종 실행화면이다

이렇게 사용자 목록을 누르면 등록한 사용자 리스트를 볼수있다

 

 

 

 

 

[유튜버 "만들면서 배워가는 프로그래머"님 영상 참고]