即使 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 中被切断

为啥 volatile 在多线程 C 或 C++ 编程中没有用?

SSAS:我的维度表可以包含事实表中没有的键吗?