【问题标题】:Recycler view with Firebase data only loads when scrolling带有 Firebase 数据的回收站视图仅在滚动时加载
【发布时间】:2017-02-22 07:59:13
【问题描述】:

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

代码

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

 mLayoutManager = new LinearLayoutManager(getActivity());
 mLayoutManager.setReverseLayout(true);
 mLayoutManager.setStackFromEnd(true);
 mRecyclerView.setLayoutManager(mLayoutManager);
 mRecyclerView.setHasFixedSize(true);

 mRecyclerView.getRecycledViewPool().setMaxRecycledViews(1,0);                                     
 mRecyclerView.setAdapter(new RecyclerView.Adapter() {
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return null;
        }

        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        }

        @Override
        public int getItemCount() {
            return 0;
        }
    });

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) {

    }
});

所以这是应用启动时的结果(三个字段缺少数据):

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

【问题讨论】:

    标签: android firebase android-recyclerview firebase-realtime-database


    【解决方案1】:

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

    一旦数据从服务器进来,你需要提醒列表。你可以通过调用adapter.notifyDataSetChanged()来做到这一点。

    【讨论】:

    • 感谢您的回答,我刚刚添加了adapter.notifyDataSetChanged(),仍然是同样的问题。问题是标题和内容已加载,但在我滚动回收站视图之前,不会加载来自第二个 Firebase 数据提取的数据。
    • 它们可能加载,但只是未显示。通常,这涉及通知适配器(并从那里通知视图)数据已更改。
    • 我的错,我在第二次提取后最终添加了adapter.notifyDataSetChanged(),它成功了,谢谢。
    • 你已经走了很远,所以这只是最后一步。不幸的是,它很容易忘记或根本不知道。很高兴听到你成功了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多