【问题标题】:Android Kotlin Firebase real time database: RecyclerView Shows EmptyAndroid Kotlin Firebase 实时数据库:RecyclerView 显示为空
【发布时间】:2020-02-10 08:46:20
【问题描述】:

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

能否请您查看这些代码并帮助找出这些代码不显示来自 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()
    }

}

数据库结构为: - 用户 - xGKiiLnf6TWhJeThkeKbZxtwHr1 -电子邮件: -照片: -用户身份: - gYJMhNRZ5XPMzAROsoNyQOmdVFd2 -电子邮件: -照片: -用户身份: - 疾病 - 用户 -gYJMhNRZ5XPMzAROsoNyQOmdVFd2 -184b4d0f-9cd3-413b-b4ed-3b6485066 -日期: -photo_id:

【问题讨论】:

  • 你能添加你的数据库结构吗?
  • 这段代码中到底有什么不符合您的预期?
  • 它有什么问题?
  • 当用户登录应用程序时,他/她的数据疾病信息应显示在屏幕上。但是,屏幕是空的。这些代码不会出错,但不会显示用户的任何信息。
  • --user - gYJMhNRZ5XPMzAROsoNyQOmdVFd2 -email: -photo: - userid

标签: android firebase kotlin android-recyclerview


【解决方案1】:

enter image description here首先,您的ValueEventListener 是多余的。因此,无需调用Beginsicknesslistener,而是从onCreate 调用BringSickness

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()
            }
        })

}

建议:你应该在编码过程中关注standard naming convention

【讨论】:

  • 谢谢,但是:错误:在 OnDataChange() 下,在这一行; allsickness?.add(tempsickness) 它给出了这个错误:单词“tempsickness”有一条红线。错误信息是,类型不匹配:推断类型是用户病?但用户病是意料之中的
  • 如果我把它改成用户病,那么错误是:它没有伴生对象,必须初始化。我现在该怎么办?
  • 谢谢。但是,它没有显示任何东西:((它没有给出错误,但没有显示来自数据库的数据
  • myAdapter:SicknessRecylerViewAdapter@12523。而且,mySicknessReferans:“https://......com”。线; var userid = FirebaseAuth.getInstance().currentUser?.uid 返回数据。在查询行上,我按了 3 次 F8,然后光标转到了 BringSickness() 函数的最后一个括号。然后,我单击“恢复程序”,然后光标转到另一个断点,即 for(Onesickness in p0!!.children)。但是,如果我单击 F8,则无需进入下一行,光标就会转到 myAdapter?.notifyDataSetChanged()。然后结果是空页
  • 这意味着没有数据来自数据库。您的访问规则是什么,您可以添加数据库的屏幕截图而不是手写吗?
猜你喜欢
  • 1970-01-01
  • 2018-11-15
  • 2021-01-15
  • 2021-08-22
  • 2018-08-30
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多