【问题标题】:How to dismiss a progress bar even if there is no view to populate in the FirebaseListAdapter?即使 FirebaseListAdapter 中没有要填充的视图,如何关闭进度条?
【发布时间】:2024-05-19 17:05:01
【问题描述】:

我使用 FirebaseUI FirebaseListAdapter。加载数据需要一些时间,我想显示一个旋转的圆圈。我可以通过在 populateView 中将视图可见性设置为不可见来关闭进度条,但如果没有要填充的视图,它就不起作用。如何处理?

【问题讨论】:

    标签: android firebase firebase-realtime-database firebaseui


    【解决方案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
    最近更新 更多