Android 仅在滚动时加载带有Firebase数据的回收器视图

Android 仅在滚动时加载带有Firebase数据的回收器视图,android,firebase,android-recyclerview,firebase-realtime-database,Android,Firebase,Android Recyclerview,Firebase Realtime Database,我正在使用Firebase并使用android.support.v7.widget.RecyclerView。问题在于onStart视图加载为空,只有在滚动之后才填充数据。知道为什么吗 代码: RecyclerView(我正在启动时设置一个空适配器,以避免“RecyclerView:未连接适配器;跳过布局”): Firebase数据获取: databaseReference.child("/News").orderByChild("createdAt").addValueEventListene

我正在使用
Firebase
并使用
android.support.v7.widget.RecyclerView
。问题在于
onStart
视图加载为空,只有在滚动之后才填充数据。知道为什么吗

代码

RecyclerView(我正在启动时设置一个空适配器,以避免“RecyclerView:未连接适配器;跳过布局”):

Firebase数据获取:

databaseReference.child("/News").orderByChild("createdAt").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(final DataSnapshot dataSnapshot) {

        for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {

            final News news = postSnapshot.getValue(News.class);
            final PostListClass postListClass = new PostListClass();
            //add fac id admin
            if (news.getFaculteId().equals(userFaculteId) || news.getFaculteId().equals("Admin")) {
                postListClass.setPostId(postSnapshot.getKey());
                postListClass.setPostTitle(news.getHeadlines());
                postListClass.setPostDescription(news.getDetails());

                databaseReference.child("/users").child(news.getAuthor()).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot usersSnapShot) {
                        User user = usersSnapShot.getValue(User.class);

                        postListClass.setPostOwnerId(usersSnapShot.getKey());
                        postListClass.setPostOwnerName(user.getPrenom() + " " + user.getNom());
                        postListClass.setPostOwnerPromo(user.getPromotion());

                        try {
                            Calendar cal = Calendar.getInstance(Locale.ENGLISH);
                            cal.setTimeInMillis(news.getCreatedAt() * 1000);
                            SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
                            Date date = sdf.parse(DateFormat.format("dd-MM-yyyy", cal).toString());
                            String day = (String) android.text.format.DateFormat.format("dd", date);
                            String month = (String) android.text.format.DateFormat.format("MMM", date);
                            postListClass.setPostDate(day + " " + month);
                        } catch (java.text.ParseException e) {
                            e.printStackTrace();
                        }
                        storageRef.child("users/" + news.getAuthor() + ".jpg").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                            @Override
                            public void onSuccess(Uri uri) {
                                postListClass.setPostOwnerImageUrl(String.valueOf(uri));
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception exception) {
                                // Handle any errors

                                if (exception.getClass().isInstance(StorageException.class)) {
                                    postListClass.setPostOwnerImageUrl("NullImage");

                                }

                            }
                        });

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                    }
                });

                databaseReference.child("/News").child(postSnapshot.getKey()).child("/Comments").addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        postListClass.setPostComments(String.valueOf(dataSnapshot.getChildrenCount()));

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

                storageRef.child("News/" + postSnapshot.getKey() + ".png").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        postListClass.setPostImageUrl(String.valueOf(uri));

                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {

                        postListClass.setPostImageUrl("NullImage");

                    }
                });

                postListClasses.add(postListClass);


            }

        }

       postsAdapter = new PostsAdapter(getContext(), postListClasses);
        mRecyclerView.setAdapter(postsAdapter);

    }


    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
databaseReference.child(“/News”).orderByChild(“createdAt”).addValueEventListener(新的ValueEventListener(){
@凌驾
公共无效onDataChange(最终数据快照数据快照){
对于(DataSnapshot postSnapshot:DataSnapshot.getChildren()){
final News=postSnapshot.getValue(News.class);
final PostListClass PostListClass=新的PostListClass();
//添加fac id管理员
如果(news.getFaculteId().equals(userFaculteId)| news.getFaculteId().equals(“Admin”)){
setPostId(postSnapshot.getKey());
setPostTitle(news.getHeaders());
setPostDescription(news.getDetails());
databaseReference.child(“/users”).child(news.getAuthor()).addListenerForSingleValueEvent(新值EventListener()){
@凌驾
public void onDataChange(DataSnapshot usersSnapShot){
User=usersSnapShot.getValue(User.class);
setPostOwnerId(usersSnapShot.getKey());
postListClass.setPostOwnerName(user.getPrenom()+“”+user.getNom());
setPostOwnerPromo(user.getPromotion());
试一试{
Calendar cal=Calendar.getInstance(Locale.ENGLISH);
cal.setTimeInMillis(news.getCreatedAt()*1000);
SimpleDataFormat sdf=新的SimpleDataFormat(“dd-MM-yyyy”);
Date-Date=sdf.parse(DateFormat.format(“dd-MM-yyyy”,cal.toString());
String day=(String)android.text.format.DateFormat.format(“dd”,日期);
String month=(String)android.text.format.DateFormat.format(“MMM”,date);
postListClass.setPostDate(天+月);
}catch(java.text.parsee){
e、 printStackTrace();
}
storageRef.child(“users/”+news.getAuthor()+“.jpg”).getDownloadUrl().addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时的公共无效(Uri){
setPostOwnerImageUrl(String.valueOf(uri));
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
//处理任何错误
if(exception.getClass().isInstance(StorageException.class)){
setPostOwnerImageUrl(“NullImage”);
}
}
});
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
databaseReference.child(“/News”).child(postSnapshot.getKey()).child(“/Comments”).addValueEventListener(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
setPostComments(String.valueOf(dataSnapshot.getChildrenCount());
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
storageRef.child(“News/”+postSnapshot.getKey()+“.png”).getDownloadUrl().addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时的公共无效(Uri){
setPostImageUrl(String.valueOf(uri));
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
setPostImageUrl(“NullImage”);
}
});
添加(postListClass);
}
}
postsAdapter=新的postsAdapter(getContext(),postListClasses);
mRecyclerView.setAdapter(postsAdapter);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
这是应用程序启动时的结果(三个字段缺少数据):

databaseReference.child("/News").orderByChild("createdAt").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(final DataSnapshot dataSnapshot) {

        for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {

            final News news = postSnapshot.getValue(News.class);
            final PostListClass postListClass = new PostListClass();
            //add fac id admin
            if (news.getFaculteId().equals(userFaculteId) || news.getFaculteId().equals("Admin")) {
                postListClass.setPostId(postSnapshot.getKey());
                postListClass.setPostTitle(news.getHeadlines());
                postListClass.setPostDescription(news.getDetails());

                databaseReference.child("/users").child(news.getAuthor()).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot usersSnapShot) {
                        User user = usersSnapShot.getValue(User.class);

                        postListClass.setPostOwnerId(usersSnapShot.getKey());
                        postListClass.setPostOwnerName(user.getPrenom() + " " + user.getNom());
                        postListClass.setPostOwnerPromo(user.getPromotion());

                        try {
                            Calendar cal = Calendar.getInstance(Locale.ENGLISH);
                            cal.setTimeInMillis(news.getCreatedAt() * 1000);
                            SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
                            Date date = sdf.parse(DateFormat.format("dd-MM-yyyy", cal).toString());
                            String day = (String) android.text.format.DateFormat.format("dd", date);
                            String month = (String) android.text.format.DateFormat.format("MMM", date);
                            postListClass.setPostDate(day + " " + month);
                        } catch (java.text.ParseException e) {
                            e.printStackTrace();
                        }
                        storageRef.child("users/" + news.getAuthor() + ".jpg").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                            @Override
                            public void onSuccess(Uri uri) {
                                postListClass.setPostOwnerImageUrl(String.valueOf(uri));
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception exception) {
                                // Handle any errors

                                if (exception.getClass().isInstance(StorageException.class)) {
                                    postListClass.setPostOwnerImageUrl("NullImage");

                                }

                            }
                        });

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                    }
                });

                databaseReference.child("/News").child(postSnapshot.getKey()).child("/Comments").addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        postListClass.setPostComments(String.valueOf(dataSnapshot.getChildrenCount()));

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

                storageRef.child("News/" + postSnapshot.getKey() + ".png").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        postListClass.setPostImageUrl(String.valueOf(uri));

                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {

                        postListClass.setPostImageUrl("NullImage");

                    }
                });

                postListClasses.add(postListClass);


            }

        }

       postsAdapter = new PostsAdapter(getContext(), postListClasses);
        mRecyclerView.setAdapter(postsAdapter);

    }


    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

滚动后(填写缺失的数据):


数据是从Firebase异步加载的。因此,当您将适配器附加到列表时,还没有数据


一旦数据从服务器传入,您需要提醒该列表。您可以通过调用
adapter.notifyDataSetChanged()

来完成此操作。谢谢您的回答,我刚刚添加了
adapter.notifyDataSetChanged()
,仍然是相同的问题。问题是标题和内容都已加载,但第二次Firebase数据获取的数据在我滚动“回收器”视图之前不会加载。它们可能已加载,但只是没有显示。一般来说,这包括通知适配器(以及从那里开始的视图)数据已更改。糟糕的是,我在第二次获取数据后添加了
adapter.notifyDataSetChanged()