【问题标题】:Use of progressbar while fetching data from firebase database to an android app从firebase数据库获取数据到android应用程序时使用进度条
【发布时间】: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

【问题讨论】:

  • 请编辑您的问题并将代码添加为文本,添加为图像。

标签: android firebase firebase-realtime-database


【解决方案1】:

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

progressLayout.visibility = View.VISIBLE

并添加以下行:

progressLayout.visibility = View.GONE

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

【讨论】:

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