저번시간에 이어서 이번엔 파이어베이스 데이터베이스에 등록된 사용자정보를 리스트에 보여주는 것을 만들어볼것이다
먼저 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을 연결해줄 어뎁터를 생성해주겠다
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
그냥 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
마지막으로로 MainActivity로 돌아가서 사용자 목록 버튼을 눌렀을때 작동하도록 해보겠다
// 사용자 목록 버튼 클릭했을때
binding.listBtn.setOnClickListener {
val intent : Intent = Intent(this@MainActivity, UserListActivity::class.java)
startActivity(intent)
}
MainActivity.kt
최종 실행화면이다
이렇게 사용자 목록을 누르면 등록한 사용자 리스트를 볼수있다
[유튜버 "만들면서 배워가는 프로그래머"님 영상 참고]
'개발 노트 > Kotlin' 카테고리의 다른 글
Firebase 프로젝트 개수 상향요청 (0) | 2024.01.30 |
---|---|
리스트뷰 vs 리사이클러뷰 (0) | 2024.01.30 |
[Android/Kotlin] 파이어베이스 CRUD 만들기 (2) - 사용자 등록 (0) | 2024.01.26 |
[Android/Kotlin] 파이어베이스 CRUD 만들기 (1) - 프로젝트 생성, 파이어베이스 연동 (0) | 2024.01.26 |
[Kotlin]BottomNavigation (0) | 2024.01.18 |