如果是您的个人资料,则新闻提要中的帖子会重复出现,其他用户的帖子只会出现一次

JMB:

我有以下问题。其他用户的帖子也只有一篇很好。但是,如果这是您的个人资料,则在HomeFragment中帖子重复出现,我不确定为什么会这样。

用我的readPosts();方法,如果我摆脱了这一行,} else if (mFirebaseUser.getUid().equals(post.getPublisher())) {mPostLists.add(post);那很好,但是我的帖子不会只显示我关注的人的帖子。我需要我的消息也出现在新闻提要中,但一次不能重复。我所有的帖子都被复制了。同一则帖子在我的供稿上出现两次。有人可以告诉我我在做什么错吗?

我的readPosts();方法做错了,但是我不确定在玩了一堆之后怎么办。

家庭碎片

public class HomeTabLayoutFragment extends Fragment {

    private ProgressBar mProgressBar;
    private PostAdapter mPostAdapter;
    private List<Post> mPostLists;

    private FirebaseAuth mFirebaseAuth;
    private FirebaseUser mFirebaseUser;

    private List<String> mFollowingList;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_home_tab_layout, container, false);

        mFirebaseAuth = FirebaseAuth.getInstance();
        mFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();

        mProgressBar = v.findViewById(R.id.progress_circular);

        RecyclerView recyclerView = v.findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
        linearLayoutManager.setReverseLayout(true);
        linearLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(linearLayoutManager);
        mPostLists = new ArrayList<>();
        mPostAdapter = new PostAdapter(getContext(), mPostLists);
        recyclerView.setAdapter(mPostAdapter);

        SwipeRefreshLayout refreshLayout = v.findViewById(R.id.refresh);
        refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                refreshLayout.setRefreshing(false);
            }
        });

        checkIfUserExists();
        checkFollowing();

        return v;
    }

    private void checkIfUserExists() {
        if (mFirebaseAuth == null) {
            Intent intent = new Intent(getContext(), RegisterActivity.class);
            startActivity(intent);
        }
    }

    private void checkFollowing() {
        mFollowingList = new ArrayList<>();
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Follow").child(mFirebaseAuth.getCurrentUser().getUid()).child("Following");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mFollowingList.clear();
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    mFollowingList.add(snapshot.getKey());
                }

                readPosts();
            }

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

            }
        });
    }

    private void readPosts() {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mPostLists.clear();
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    Post post = snapshot.getValue(Post.class);
                    for (String id : mFollowingList) {
                        if (post != null) {
                            if (post.getPublisher().equals(id)) {
                                mPostLists.add(post);
                            } else if (mFirebaseUser.getUid().equals(post.getPublisher())) {
                                mPostLists.add(post);
                            }
                        }
                    }

                    mPostAdapter.notifyDataSetChanged();
                    mProgressBar.setVisibility(View.GONE);
                }
            }

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

            }
        });
    }
}
斯坦:

在readPosts()中检查您的内部循环。该循环基于mFollowingList的元素。这种情况与此无关:

if (mFirebaseUser.getUid().equals(post.getPublisher()))

对于内部循环的每次执行,它都是true或false。因此,它可能会添加比您想要的更多的元素。您可能希望将其放在外部循环中,而不是内部循环中-每个帖子只执行一次。

不过,我还要进行一些更改。可以在循环外部进行检查(发布!= null)。无需无缘无故地使其多次循环。notifyDataSetChanged()也不需要在任何循环内,它需要被调用一次。

关于代码样式的额外说明:-)-您使用了太多的缩进。将内容提取到单独的方法中以提高可读性是有意义的,最好使用描述性名称来使方法简短。

private void readPosts() {
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts");
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            mPostLists.clear();
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                Post post = snapshot.getValue(Post.class);

                if (post != null && shouldAddPost(post)) {
                    mPostLists.add(post);
                }
            }

            mPostAdapter.notifyDataSetChanged();
            mProgressBar.setVisibility(View.GONE);
        }

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

        }
    });
}

private boolean shouldAddPost(@NotNull Post post) {
    boolean isFollowingPublisher = false;
    for (String id : mFollowingList) {
        if (post.getPublisher().equals(id)) {
            isFollowingPublisher = true;
        }
    }

    boolean isPublisher = post.getPublisher().equals(mFirebaseUser.getUid());

    return isFollowingPublisher || isPublisher;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Django中链接到其他用户的个人资料?

热门获取属于其他用户的用户的帖子

C#Selenium使用其他用户个人资料启动Chrome

如何保持第一次出现的值在python的数据框中重复出现?

Django公开用户个人资料+用户帖子

如何在Django上编辑其他用户个人资料

其他用户的个人资料未显示,仅显示当前用户名。如何显示其他用户的个人资料?

如何在Graph API中将用户的新闻提要过滤到特定应用程序中的帖子/动作

登录的用户正在访问其他用户个人资料

是否有一种设置可以阻止出现在新闻提要中的显示我自己名字的Facebook页面帖子?

当由其他用户帐户安装时,TortoiseSVN覆盖图标不会出现吗?

如何在我的PHP代码中设置个人资料名称或其他用户名

两个单独的模板个人资料页面供用户本人和其他用户使用?

如何在流星中获取其他用户的个人资料详细信息

导航到其他用户的个人资料(laravel 5.2)

Facebook4j:从用户获取提要,但不包括其他用户的帖子

在django中以其他用户身份查看个人资料页面

如何防止用户编辑或删除其他用户帖子?姜戈

使用户帖子显示在个人资料页面上

/etc/profile/ 中设置的路径不会出现在其他用户的环境中

如何防止用户访问其他用户的个人资料?

如何通过简单地更改 url 中的 id 来防止登录用户访问其他用户的个人资料,在 django 中?

我想更新所有帖子中的用户个人资料图片以及他在用户更新/更改他的个人资料图片时发布的图片

其他用户如何在 octobercms 中查看用户的个人资料详细信息?

防止在 django 中编辑其他用户的个人资料

登录时将帖子添加到其他用户的帖子

如何在不影响其他用户的个人资料的情况下向用户的个人资料添加数据 React

Android studio 如何让查看某人个人资料的其他用户的可见性消失 Firebase

Django 限制其他用户编辑帖子