首页 > 解决方案 > Android Kotlin Firebase 实时数据库:RecyclerView 显示为空

问题描述

我已经阅读了所有类似的问题,但是找不到解决方案。没有任何错误。

您能否查看这些代码并帮助找出这些代码不显示 Firebase 数据的问题。查询有问题吗?或 RecyclerView?或适配器?

class OurResults : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_allresults)
        actionBar.setBackgroundDrawable(resources.getDrawable(R.drawable.actionbar))

        BeginFirebaseAuthListener()
        Beginsicknesslistener()
    }

    var mValueEventListener:ValueEventListener=object :ValueEventListener{
        override fun onCancelled(p0: DatabaseError) {
            TODO("not implemented")
        }
        override fun onDataChange(p0: DataSnapshot) {
            BringSickness()
        }
    }

    private fun BringSickness() {
        if(allsickness==null){
            allsickness=ArrayList<usersickness>()
        }
        mySicknessReferans=FirebaseDatabase.getInstance().getReference()
        var userid=FirebaseAuth.getInstance().currentUser?.uid
        var myQuery=mySicknessReferans?.child("sickness/users/$user_id"+"/")!!
            .addListenerForSingleValueEvent(object :ValueEventListener{
                override fun onCancelled(p0: DatabaseError) {
                    TODO("not implemented")
                }
                override fun onDataChange(p0: DataSnapshot) {
                    for(Onesickness in p0!!.children){
                        var tempsickness=usersickness()  
                        tempsickness.photo_result=Onesickness.getValue(usersickness::class.java)!!.photo_result
                        tempsickness.date=Onesickness.getValue(usersickness::class.java)!!.date
                        allsickness?.add(tempsickness)
                        myAdapter?.notifyDataSetChanged()
                    }
                }
            })
        if(myAdapter==null){
            initsicknesslist()
        }
    }

    private fun initsicknesslist() {
        myAdapter= SicknessRecyclerViewAdapter(this,allsickness!!)
        rv_sickness.adapter=myAdapter
        rv_sickness.layoutManager=LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)
        rv_sickness.scrollToPosition(myAdapter?.itemCount!!-1)
    }

    private fun Beginsicknesslistener() {
        mySicknessReferans=FirebaseDatabase.getInstance().getReference()
            .child("sickness/users/"+FirebaseAuth.getInstance().currentUser?.uid)
        mySicknessReferans?.addValueEventListener(mValueEventListener)
    }

    private fun BeginFirebaseAuthListener() {
        mAuthListener=object:FirebaseAuth.AuthStateListener{
            override fun onAuthStateChanged(p0: FirebaseAuth) {
                var myUser=p0.currentUser
                if(myUser==null){
                    var intent=Intent(this@allresults,LoginActivity::class.java)
                    startActivity(intent)
                    finish()
                }
            }
        }
    }


    override fun onStart() {
        super.onStart()
        FirebaseAuth.getInstance().addAuthStateListener (mAuthListener!!)
    }

    override fun onStop() {
        super.onStop()
        if(mAuthListener!=null){
            FirebaseAuth.getInstance().removeAuthStateListener (mAuthListener!!)
        }
    }

    override fun onResume() {
        super.onResume()
    }

}

数据库结构是: --user - xGKiiLnf6TWhJeThkeKbZxtwHr1 -email: -photo: -userid: - gYJMhNRZ5XPMzAROsoNyQOmdVFd2 -email: -photo: -userid: --sickness - users -gYJMhNRZ5XPMzAROsoNyQOmdVFd2 -184b4d0f-93b64-413b64 -b -photo_id:

标签: androidfirebasekotlinandroid-recyclerview

解决方案


在此处输入图像描述首先,您的ValueEventListener内容是多余的。所以,不需要打电话Beginsicknesslistener而是打电话BringSicknessonCreate

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    .....

    BeginFirebaseAuthListener()
    //Beginsicknesslistener()

    BringSickness()
}

然后解析里面的疾病数据,BringSickness如下所示:

private fun BringSickness() {
    if(allsickness == null){
        allsickness = ArrayList<usersickness>()
    }

    if(myAdapter == null){
        initsicknesslist()
    }

    mySicknessReferans = FirebaseDatabase.getInstance().getReference()
    var userid = FirebaseAuth.getInstance().currentUser?.uid
    var myQuery = mySicknessReferans?.child("sickness/users/$user_id"+"/")!!
        .addListenerForSingleValueEvent(object : ValueEventListener {
            override fun onCancelled(p0: DatabaseError) {
                TODO("not implemented")
            }
            override fun onDataChange(p0: DataSnapshot) {
                for(Onesickness in p0!!.children){
                    var tempsickness = Onesickness.getValue(usersickness::class.java)

                    if(tempsickness != null) {
                        allsickness?.add(tempsickness)
                    }
                }

                //Update adapter after collecting all the data
                myAdapter?.notifyDataSetChanged()
            }
        })

}

建议:编码时应遵循标准命名约定。


推荐阅读