从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 获取数据时如何显示加载的项目
从android中的firebase函数接收json数据给出空值
如何在 Android Studio 中使用 Kotlin 从 Firebase 中的数据库中获取特定值?