마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Firebase 리사이클러뷰 DB읽기 질문입니다.

0 추천

어플리케이션 처음 실행 시 메인 화면에서 버튼을 처음 클릭하면 왼쪽과 같이 리사이클러뷰에 아무 내용이 없이 나오다가 메인화면으로 뒤로가기 후 다시 버튼 클릭 시 오른쪽같이 파이어베이스 DB내용이 리사이클러뷰에 제대로 반영이 되는데 왜이러는 건가요? 처음 어플리케이션 실행 시 오른쪽 그림 같이 DB에 즉시 적용되서 나오고 싶습니다.

코틀린으로 작성했습니다.

class list_test : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_list_test)
        //임시 Date 배열로 저장
        val example = arrayListOf<Date>()
        example.clear()
        val database : FirebaseDatabase = FirebaseDatabase.getInstance()
        for( i in 1..3){
            val myRef: DatabaseReference = database.getReference("List").child("list$i")

            myRef.addValueEventListener(object : ValueEventListener {
                override fun onDataChange(dataSnapshot: DataSnapshot) {
                    val value = dataSnapshot?.value
                    example.add(Date("$value", 2022))
                }

                override fun onCancelled(p0: DatabaseError) {
                    println("Failed to read value.")
                }

            })

        }
        recycler_view.apply {
            layoutManager = LinearLayoutManager(this@list_test)
            adapter = DateAdapter(example){ date ->
                //확인용 Toast
                Toast.makeText(this@list_test, "$date",Toast.LENGTH_SHORT).show()
            }

        }
    }
}
//Adapter 설정
class DateAdapter(val items: List<Date>, private val clickListener: (date: Date) -> Unit) :
        RecyclerView.Adapter<DateAdapter.DateViewHolder>(){
    //ViewHolder 설정

    class DateViewHolder(var binding: ItemDateBinding): RecyclerView.ViewHolder(binding.root)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DateViewHolder {
        val view = LayoutInflater.from(parent.context)
                .inflate(R.layout.item_date, parent, false)
        val viewHolder = DateViewHolder(ItemDateBinding.bind(view))

        view.setOnClickListener {
            clickListener.invoke(items[viewHolder.adapterPosition])
        }
        return viewHolder
    }

    override fun onBindViewHolder(holder: DateViewHolder, position: Int) {
        holder.binding.date = items[position]
    }

    override fun getItemCount(): Int = items.size
}

 

nagada32 (290 포인트) 님이 2021년 3월 14일 질문
nagada32님이 2021년 3월 14일 수정

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...