即使 FirebaseListAdapter 中没有要填充的视图,如何关闭进度条?
Posted
技术标签:
【中文标题】即使 FirebaseListAdapter 中没有要填充的视图,如何关闭进度条?【英文标题】:How to dismiss a progress bar even if there is no view to populate in the FirebaseListAdapter? 【发布时间】:2021-07-23 06:51:46 【问题描述】:我使用 FirebaseUI FirebaseListAdapter。加载数据需要一些时间,我想显示一个旋转的圆圈。我可以通过在 populateView 中将视图可见性设置为不可见来关闭进度条,但如果没有要填充的视图,它就不起作用。如何处理?
【问题讨论】:
【参考方案1】:更新:现在的 FirebaseUI 适配器有一个 onDataChanged()
方法,您可以覆盖该方法以检测它们何时完成加载一组数据。
请参阅source code on github。从那里:
每次完全处理数据库中的更新时都会触发此方法。所以第一次调用这个方法时,已经加载了初始数据——包括根本没有数据可用的情况。每次下次调用该方法时,都会完成一次完整的更新(可能包括对多个子项的更新)。
您通常会重写此方法以隐藏加载指示器(在初始加载之后)或完成对 UI 元素的批量更新。
FirebaseUI 示例应用会覆盖 onDataChanged()
以隐藏其“加载”指示器:
public void onDataChanged()
// If there are no chat messages, show a view that invites the user to add a message.
mEmptyListMessage.setVisibility(getItemCount() == 0 ? View.VISIBLE : View.GONE);
这样做☝️
不要那样做?
原答案
FirebaseUI 列表适配器在内部使用 Firebase ChildEventListener
。此侦听器仅针对相关子事件触发。如果没有子节点,则不会触发任何事件。
您可以通过将额外的 value 侦听器附加到您传递给适配器的引用/查询来检测这种情况。
DatabaseReference list = mDatabase.child("messages");
showSpinner();
mAdapter = new FirebaseListAdapter<Message>(......, list)
void populateView(View view, Message message, int position)
// the first message was loaded
hideSpinner();
);
list.addListenerForSingleValueEvent(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot dataSnapshot)
// the initial data is loaded (even if there was none)
hideSpinner();
@Override
public void onCancelled(DatabaseError databaseError)
Log.w(TAG, "onCancelled", databaseError.toException());
);
【讨论】:
感谢 onDataChange() 方法!它就像一个魅力:D以上是关于即使 FirebaseListAdapter 中没有要填充的视图,如何关闭进度条?的主要内容,如果未能解决你的问题,请参考以下文章
Android Proguard 和 FirebaseListAdapter 冲突
如何在 FirebaseListAdapter 中使用自定义适配器
如何在 Item Click 上从 FirebaseListAdapter 获取 obj 密钥。 Firebase 用户界面
当页面自动刷新但在谷歌浏览器中没有时,语音在 Firefox 中被切断