从firebase数据库获取数据到android应用程序时使用进度条

Posted

技术标签:

【中文标题】从firebase数据库获取数据到android应用程序时使用进度条【英文标题】:Use of progressbar while fetching data from firebase database to an android app 【发布时间】:2021-05-12 15:53:12 【问题描述】:

我想在屏幕上显示进度条,直到从 firebase 数据库中获取所有必需的数据。

如何在 fetchMenu() [in MenuFragment.kt] 中使用以下代码

.addOnSuccessListener(OnSuccessListener<Void?>  // Write was successful!
            // ...
            progressBar.visibility = View.GONE
        )
        .addOnFailureListener(OnFailureListener  // Write failed
            // ...
            progressBar.visibility = View.GONE
        )

MenuFragment.kt

class MenuFragment : Fragment() 

private var dishList: MutableList<DishModel> = mutableListOf()
private lateinit var myRef: DatabaseReference
lateinit var list: RecyclerView
lateinit var proceedToCartLayout: RelativeLayout
lateinit var addToCartBtn: Button
private var selectedCategory = ""
lateinit var progressLayout: RelativeLayout
lateinit var progressBar: ProgressBar

companion object 
    fun newInstance(): Fragment 
        return MenuFragment()
    


override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? 
    val view = inflater.inflate(R.layout.fragment_menu, container, false)
    //retrieve id
    val bundle = this.arguments
    selectedCategory = bundle!!.getString("CATEGORY_ID")!!
    list = view.findViewById(R.id.recyclerMenu)
    myRef = FirebaseDatabase.getInstance().getReference("Category")
    proceedToCartLayout = view.findViewById(R.id.ProceedToCart)
    addToCartBtn = view.findViewById(R.id.btn_cart)
    progressLayout = view.findViewById(R.id.progressLayout)
    progressBar = view.findViewById(R.id.progressBar)


    return view



override fun onResume() 

    if (ConnectionManager().checkConnectivity(activity as Context)) 
        fetchMenu()

     else 

        val alterDialog = androidx.appcompat.app.AlertDialog.Builder(activity as 
Context)
        alterDialog.setTitle("No Internet")
        alterDialog.setMessage("Connect to internet to continue")
        alterDialog.setIcon(R.drawable.nointernet)
        alterDialog.setPositiveButton("Open Settings")  _, _ ->
            val settingsIntent = Intent(Settings.ACTION_SETTINGS)//open wifi settings
            startActivity(settingsIntent)
        

        alterDialog.setNegativeButton("Exit")  _, _ ->
            ActivityCompat.finishAffinity(activity as Activity)
        
        alterDialog.setCancelable(false)

        alterDialog.create()
        alterDialog.show()

    

    super.onResume()


private fun fetchMenu() 


    progressLayout.visibility = View.VISIBLE

    myRef.child(selectedCategory)
        .addValueEventListener(object : ValueEventListener 
            override fun onCancelled(p0: DatabaseError) 
                progressLayout.visibility = View.GONE
                Toast.makeText(context, "$p0", Toast.LENGTH_SHORT).show()
            


            override fun onDataChange(p0: DataSnapshot) 
                progressLayout.visibility = View.GONE
                if (p0.exists()) 
                    dishList.clear()
                    for (i in p0.children) 
                        val plan = i.getValue(DishModel::class.java)
                        dishList.add(plan!!)
                    

                    val adapter = MenuAdapter(
                        context!!,
                        R.layout.menu_list_item,
                        dishList,
                        proceedToCartLayout,
                        addToCartBtn, selectedCategory
                    )
                    list.adapter = adapter

                
            


        )




我在使用进度条后得到了结果,但没有得到所需的结果,因为我想显示进度条,直到 RecyclerView 的所有行都被从 firebase 数据库获取的数据填充并且所有视图都正确放置.

我在使用进度条时得到了这个

see the video

【问题讨论】:

请编辑您的问题并将代码添加为文本,添加为图像。 【参考方案1】:

根据您共享的图像,您根本没有显示“ProgressBar”。要解决此问题,请取消注释以下代码行:

progressLayout.visibility = View.VISIBLE

并添加以下行:

progressLayout.visibility = View.GONE

在“onDataChange()”方法中也是如此。通过这种方式,当调用“fetchMenu()”方法时,您将开始显示 ProgressBar,一旦您收到响应,您可以隐藏数据或异常。

【讨论】:

当没有得到所需的结果时,我评论了progressLayout的可见性。我正在考虑使用“addOnSuccessListener”。我之前按照你说的做了,也得到了结果,但没有得到我想要的结果。我想显示进度条,直到列表的所有行(在 RecyclerView 中)都填满了从 firebase 数据库中获取的数据(包括一些图像)。 您的布局 (XML) 文件中的 progressLayout 是如何定义的? 嗨,安居!我可以帮助您了解其他信息吗?如果您认为我的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记(✔️)来接受它。应将颜色更改为绿色。我真的很感激。谢谢!

以上是关于从firebase数据库获取数据到android应用程序时使用进度条的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebase android kotlin 获取数据时如何显示加载的项目

如何将数据从 Firebase 获取到哈希映射中?

从android中的firebase函数接收json数据给出空值

如何在 Android Studio 中使用 Kotlin 从 Firebase 中的数据库中获取特定值?

获取用于从 Android 设备连接到 Firebase 的 IP 地址 [重复]

如何从android上的firebase获取用户uid?