Сообщения в ленте новостей дублируются, если это ваш профиль, сообщения других пользователей выходят только один раз - PullRequest
0 голосов
/ 19 апреля 2020

У меня следующая проблема. Посты других пользователей выходят нормально только одним постом. Но если это ваш профиль, в HomeFragment посты дублируются, и я не уверен, почему это так.

В моем методе readPosts();, если я избавлюсь от этой строки } else if (mFirebaseUser.getUid().equals(post.getPublisher())) {mPostLists.add(post);, это нормально, но тогда мои сообщения не отображаются только сообщения людей, за которыми я следую. Мне нужно, чтобы мой появился и в новостной ленте, но только один раз не дублировался. Все мои посты дублируются. Один и тот же пост появляется дважды в моей ленте. Может кто-нибудь сказать мне, что я делаю неправильно?

Что-то я делаю неправильно в моем методе readPosts();, но я не уверен, что после того, как я поиграл с ним.

HomeFragment

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

            }
        });
    }
}

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Проверьте свой внутренний l oop в readPosts (). L oop основан на элементах mFollowingList. Это условие не имеет к этому никакого отношения:

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

Это будет либо true, либо false для каждого выполнения внутреннего l oop. Поэтому он может добавить больше элементов, чем вы хотите. Возможно, вы захотите поместить его во внешний l oop, а не во внутренний - чтобы выполнить его только один раз за пост.

Я бы внес еще некоторые изменения. Проверка (post! = Null) может быть выполнена за пределами l oop. Не нужно допускать его несколько раз без причины. notifyDataSetChanged () также не обязательно должен быть внутри l oop, его нужно вызывать один раз.

Дополнительно относительно стиля кода :-) - Вы используете слишком много отступов. Имеет смысл извлечь вещи в отдельный метод для удобочитаемости, это хорошая идея, чтобы методы были короткими, с описательными именами.

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;
}
0 голосов
/ 19 апреля 2020
 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);
                            }
                        }
                    }

                    if (post != null)
                        if (mFirebaseUser.getUid().equals(post.getPublisher())) {
                            mPostLists.add(post);
                        }
                }

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

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

            }
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...