Android FirebaseListAdapter完成时如何得到通知?

Android FirebaseListAdapter完成时如何得到通知?,android,listview,firebase,progressdialog,firebaseui,Android,Listview,Firebase,Progressdialog,Firebaseui,我正在使用FirebaseListAdapter,我需要显示一个ProgressDialog,但我不知道如何知道它何时完成加载 public class TabFragment1 extends ListFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

我正在使用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();
    }


}
公共类TabFragment1扩展了ListFragment{
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图根视图=充气机。充气(R.layout.tab\u fragment\u 1,容器,false);
ListView eventosView=(ListView)rootView.findViewById(android.R.id.list);
Firebase ref=新的Firebase(//myappurl);
Firebase usersRef=新的Firebase(//myappurl/eventos/users);
Singleton singletonUser=Singleton.getInstance();
setUser(singletonUser);
Firebase ref=新的Firebase(//myappurl/eventos);
FirebaseListAdapter mAdapter=新的FirebaseListAdapter(getActivity(),Evento.class,R.layout.event_行,ref){
@凌驾
受保护的void populateView(视图视图,Evento Evento){
((TextView)view.findviewbyd(R.id.eventTitle)).setText(evento.getNome());
((TextView)view.findviewbyd(R.id.eventPlace)).setText(evento.getLocal());
}
};
setListAdapter(mAdapter);
返回mAdapter;
返回rootView;
}
私有void setUser(单例单例用户){
singletonUser.getToken();
singletonUser.setUuid();
singletonUser.getUuid();
}
}

何时可以放置ProgressDialog.Disclesh()?

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

一次下载一个位置的初始数据集,结果是为每个子级调用
onchildaded()
,然后调用单个
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) {

    }
});
在上面的代码片段中,所有子项都已添加到您的
列表视图中。根据您的用例,这可能是隐藏进度条的正确时间,也可能比您想要的时间晚

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

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到达后立即隐藏进度条。

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

一次下载一个位置的初始数据集,结果是为每个子级调用
onchildaded()
,然后调用单个
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) {

    }
});
在上面的代码段中,所有的子代码都将被添加到
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到达后立即隐藏进度条。

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

/**
*每次完全处理数据库中的更新时,都会触发此方法。
*因此,第一次调用此方法时,已加载初始数据-包括案例
*当完全没有数据可用时。每次下次调用该方法时,都会进行一次完整的更新(可能是
*包含对多个子项的更新)已完成。
*
*通常会重写此方法以隐藏加载指示器(在初始加载之后)或
*完成对UI元素的批量更新。
*/
受保护的无效onDataChanged(){
}

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

/**
*每次完全处理数据库中的更新时,都会触发此方法。
*因此,第一次调用此方法时,已加载初始数据-包括案例
*当完全没有数据可用时。每次下次调用该方法时,都会进行一次完整的更新(可能是
*包含对多个子项的更新)已完成。
*
*通常会重写此方法以隐藏加载指示器(在初始加载之后)或
*完成对UI元素的批量更新。
*/
受保护的无效onDataChanged(){
}

关于第一个代码段:单值事件侦听器不会启动适配器发出的数据请求之外的另一个数据请求吗?如果onChanged()呢从未调用,因为设备没有Internet连接关于第一个代码段:单值事件侦听器不会启动除适配器发出的数据请求之外的另一个数据请求吗?如果由于设备没有Internet连接而从未调用onChanged(),该怎么办