【问题标题】:How to be notified when FirebaseListAdapter finishes?FirebaseListAdapter 完成时如何收到通知?
【发布时间】:2016-01-24 22:32:29
【问题描述】:

我正在使用 FirebaseListAdapter,我需要显示一个 ProgressDialog,但我不知道如何知道它何时完成加载。

    public class TabFragment1 extends ListFragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.tab_fragment_1, container, false);
            ListView eventosView = (ListView) rootView.findViewById(android.R.id.list);
            Firebase ref = new Firebase(//myappurl);
            Firebase usersRef = new Firebase(//myappurl/eventos/users);
            Singleton singletonUser = Singleton.getInstance();
            setUser(singletonUser);

    Firebase ref = new Firebase(//myappurl/eventos);
                    FirebaseListAdapter<Evento> mAdapter = new FirebaseListAdapter<Evento>(getActivity(), Evento.class, R.layout.event_row, ref) {
                        @Override
                        protected void populateView(View view, Evento evento) {
                            ((TextView)view.findViewById(R.id.eventTitle)).setText(evento.getNome());
                            ((TextView)view.findViewById(R.id.eventPlace)).setText(evento.getLocal());
                        }
                    };
                    setListAdapter(mAdapter);
                    return mAdapter;


            return rootView;
        }

private void setUser(Singleton singletonUser){
        singletonUser.getToken();
        singletonUser.setUuid();
        singletonUser.getUuid();
    }


}

什么时候可以放置 ProgressDialog.dismiss()?

【问题讨论】:

    标签: android listview firebase progressdialog firebaseui


    【解决方案1】:

    Firebase 是在同步数据的前提下构建的。出于这个原因,从来没有真正的时刻完成同步。

    一个位置的初始数据集一次性下载并导致每个孩子调用onChildAdded(),然后调用一个onDataChanged()。如果您想在加载此初始数据时隐藏进度条,您可以为单个事件注册一个ValueEventListener

    ref.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // the initial data has been loaded, hide the progress bar
        }
    
        @Override
        public void onCancelled(DatabaseError firebaseError) {
    
        }
    });
    

    在上面的 sn-p 中,所有孩子都已经添加到您的ListView。根据您的用例,这可能是隐藏进度条的正确时间,也可能比预期的要晚。

    如果您想知道第一个数据何时被渲染,您可以向您的适配器注册一个观察者:

    adapter.registerDataSetObserver(new DataSetObserver() {
        @Override
        public void onChanged() {
            super.onChanged();
            // the first time you get here, hide the progress bar
        }
    
        @Override
        public void onInvalidated() {
            super.onInvalidated();
        }
    });
    

    一旦第一个数据从 Firebase 到达,您就可以使用这种方法隐藏进度条。

    【讨论】:

    • 关于第一个sn-p:Single Value Event Listener除了Adapter发出的请求之外,会不会启动另一个数据请求?
    • 如果由于设备没有 Internet 连接而从未调用过 onChanged() 怎么办
    【解决方案2】:

    自 2017 年 1 月以来,FirebaseListAdapter 具有以下可以被覆盖的方法(由 Frank 在 github 上提交):

      /**
         * This method will be triggered each time updates from the database have been completely processed.
         * So the first time this method is called, the initial data has been loaded - including the case
         * when no data at all is available. Each next time the method is called, a complete update (potentially
         * consisting of updates to multiple child items) has been completed.
         * <p>
         * You would typically override this method to hide a loading indicator (after the initial load) or
         * to complete a batch update to a UI element.
         */
        protected void onDataChanged() {
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 2012-03-15
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多