java - 当firebase实时数据库中没有数据时,为什么progressDialog不会被关闭?
问题描述
这是我的代码,当 Firebase 上存在数据并提取到 UI 中时,我的 ProgressDialog 被关闭,但是当 Firebase 上没有数据时它仍在处理并且当我们点击屏幕时它不会关闭,那么我该如何关闭它?
public void ShowData()//String data)
{
final ProgressDialog progressDialog =new ProgressDialog ( this );
progressDialog.setMessage ( "Loading.." );
progressDialog.show ();
query1 = myRef.orderByChild ( "dateTime" ); // this is for Filter the data (The recently data you add is show on top of application)
// options=new FirebaseRecyclerOptions.Builder<modelClass> ().setQuery ( myRef,modelClass.class ).build ();//for retrive
options = new FirebaseRecyclerOptions.Builder < modelClass > ().setQuery ( query1 , modelClass.class ).build ();//for search and retrive
adapter = new FirebaseRecyclerAdapter < modelClass, MyVIewHolder > ( options ) {
@Override
protected void onBindViewHolder(@NonNull final MyVIewHolder holder , final int position , @NonNull modelClass model) //for binding the View of recycler_view_item_layout
{
/* holder.college.setText ( model.getCollege () );
holder.contact.setText ( model.getContact () );
holder.time.setText ( model.getDateTime ());
holder.food.setText ( model.getFood () );
holder.name.setText ( model.getName () );*/
progressDialog.dismiss ();
holder.setFoodPost ( model ); //for set all data to view
//for set intent on Contact num View
holder.contact.setOnClickListener ( new View.OnClickListener () {
@Override
public void onClick(View view) {
String phoneNum = holder.contact.getText ().toString ();
Intent in = new Intent ( Intent.ACTION_DIAL );
in.setData ( Uri.parse ( "tel:" + phoneNum ) ); // This ensures only Dial apps respond
if (in.resolveActivity ( getPackageManager () ) != null) {
startActivity ( in );
} else {
Toast.makeText ( MainActivity.this , "Failed" , Toast.LENGTH_SHORT ).show ();
}
}
} );
//for longPress on particular view(CardView)
//for Delete the particular data when press long click on the View(CardView)
holder.itemView.setOnLongClickListener ( new View.OnLongClickListener () {
@Override
public boolean onLongClick(View view) {
//for post_key we simply fetch that data postion which we want to delete
post_key = getRef ( position ).getKey ();
openDeleteWindow ();//this is a method for open the Delete Window
// Toast.makeText ( MainActivity.this , "Press" , Toast.LENGTH_SHORT ).show ();
return true;
}
} );
解决方案
onBindViewHolder
为需要在视图中显示的每个项目调用 FirebaseUI 适配器。如果没有与您在视图中显示的引用/查询匹配的数据,那么onBindViewHolder
您的适配器将永远不会被调用。
因此,如果您使用onBindViewHolder
隐藏progressDialog
,progressDialog
则只有在有项目时才会隐藏。如果没有项目,onBindViewHolder
则不会调用 并且progressDialog
将保持可见。
要隐藏progressDialog
是否有项目,您需要覆盖onDataChanged
FirebaseUI 适配器的方法并将其隐藏在那里:
adapter = new FirebaseRecyclerAdapter < modelClass, MyVIewHolder > ( options ) {
@Override
public void onDataChanged() {
progressDialog.hide();
}
@Override
protected void onBindViewHolder(@NonNull final MyVIewHolder holder , final int position , @NonNull modelClass model) {
...
由于onDataChanged
每次从 Firebase 完全接收到更新时都会调用它,因此在有数据和没有数据时都会调用它。
另见:
推荐阅读
- flutter - 改变状态在另一个类中颤动
- excel - 用美丽的汤努力获得干净的Excel
- flutter - 如何删除小部件并将其添加到小部件的动态列表中
- postgresql - 将 Postgres TDE 交叉编译到 Windows 时出现链接错误错误
- python - 提交按钮后取消选中 HTML 复选框
- android - 需要帮助诊断 Kivy Android 应用程序在启动时崩溃的原因
- python - 根据元素的值将列表拆分为子列表?
- python - Python Selenium 禁用图像/视频
- api - .Net Core 5 和 Angular 10 中的身份验证和授权使用 JWT 问题
- c# - 使用 Microsoft.Toolkit.Mvvm 和 Microsoft.Xaml.Behaviors.Wpf 将事件参数传递给命令