Java 返回片段视图后执行Firebase查询

Java 返回片段视图后执行Firebase查询,java,android,firebase,android-fragments,firebase-realtime-database,Java,Android,Firebase,Android Fragments,Firebase Realtime Database,我有一个扩展了Fragment的类,它在onCreateView方法中包含对Firebase的查询。在使用调试器分析程序之后,我意识到在返回视图之前,不会执行此查询 该查询返回将加载到recyclerview中的信息。我还为数据本身创建了一个适配器。代码不会产生任何错误,但它没有按应有的方式运行理想情况下,查询应该首先执行,这样我就可以在此recyclerview上显示数据。知道为什么会这样吗 @Nullable @Override public View onCreateView(@NonNu

我有一个扩展了
Fragment
的类,它在
onCreateView
方法中包含对Firebase的查询。在使用调试器分析程序之后,我意识到在返回视图之前,不会执行此查询

该查询返回将加载到recyclerview中的信息。我还为数据本身创建了一个适配器。代码不会产生任何错误,但它没有按应有的方式运行理想情况下,查询应该首先执行,这样我就可以在此recyclerview上显示数据。知道为什么会这样吗

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState)
{
    final View view=inflater.inflate(R.layout.frag_events, container, false);
    eventIds =new ArrayList<String>();

    //executes after view has been returned
    ValueEventListener eventIdValListener=new ValueEventListener()
    {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot)
        {
            eventIds.clear();
            if(snapshot.exists())
            {
                for (DataSnapshot e : snapshot.getChildren())
                {
                    String event = e.getValue(String.class);
                    eventIds.add(event);
                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error)
        {

        }
    };
    //returns data for current user 
    Query query=FirebaseDbSingleton.getInstance().dbRef.child("User").child(FirebaseDbSingleton.getInstance().user.getUid().toString()).child("events");
    query.addValueEventListener(eventIdValListener);
    
    return view;
}
@Nullable
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater充气机、@null最终视图组容器、@null Bundle savedInstanceState)
{
最终视图=充气机。充气(R.layout.frag_事件,容器,错误);
eventIds=newarraylist();
//在返回视图后执行
ValueEventListener eventIdValListener=新的ValueEventListener()
{
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot)
{
eventIds.clear();
if(snapshot.exists())
{
对于(DataSnapshot e:snapshot.getChildren())
{
String事件=e.getValue(String.class);
添加(事件);
}
}
}
@凌驾
已取消公共void(@NonNull DatabaseError)
{
}
};
//返回当前用户的数据
Query Query=firebasedsingleton.getInstance().dbRef.child(“用户”).child(firebasedsingleton.getInstance().User.getUid().toString()).child(“事件”);
addValueEventListener(eventIdValListener);
返回视图;
}

我给回收器和适配器留下了几行代码,只是为了保持代码简短。我有一种感觉,这可能是由于
eventIdValListener
中的innerclass造成的,但我不能完全确定。

所有查询数据库的Firebase API都是异步的,并在调用后一段时间完成。实际上,在
onCreateView
返回之前,您无法让它完成—它必须立即返回一个视图实例

由于您不知道查询需要多长时间才能完成,也无法保证需要多长时间,因此需要添加逻辑以在查询完成之前显示某些内容(例如等待指示器)。这是任何执行网络或数据库操作的应用程序的标准配置