SwipeRefreshLayout обновляет RecyclerView без необходимости опускать - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь внедрить SwipeRefreshLayout в мое приложение. Я хочу, чтобы при первоначальном открытии приложения пользователь извлекал данные из Firebase без необходимости разматывать макет, чтобы данные обновлялись. После этого, если пользователь хочет увидеть новые данные, он должен свернуть макет, чтобы RecyclerView обновлялся новыми публикациями, загруженными другими пользователями.

Проблема, с которой я сталкиваюсь, заключается в том, что когда Я загружаю сообщение из моего эмулятора, оно автоматически появляется на экране телефона, и мне не нужно его удалять. Это не то, что я хочу. Во-первых, первоначальное открытие данных приложения должно быть получено автоматически без раскрытия. После этого каждый раз, когда вы хотите увидеть новые данные, если я go в другом фрагменте и затем возвращаюсь, данные не должны обновляться, пока я не потяну вниз.

Код, который у меня есть в данный момент: последующий. Может кто-нибудь сказать мне, почему это не работает так, как мне бы хотелось?

Я относительно уверен, что это из-за моего notifyDataSetChanged(); в моем readPosts(); методе, но я не уверен как это исправить ... Должен ли я просто удалить его из readPosts(); и добавить его в mSwipeRefreshLayout.post...Runnable?

HomeFragment

public class HomeTabLayoutFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {

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

    private FirebaseAuth mFirebaseAuth;
    private FirebaseUser mFirebaseUser;

    private List<String> mFollowingList;

    private SwipeRefreshLayout mSwipeRefreshLayout;

    @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);

        mSwipeRefreshLayout = v.findViewById(R.id.refresh);
        mSwipeRefreshLayout.setOnRefreshListener(this);
        mSwipeRefreshLayout.post(() -> {
            mSwipeRefreshLayout.setRefreshing(true);
            readPosts();
        });

        checkIfUserExists();
        checkFollowing();

        return v;
    }

    @Override
    public void onRefresh() {
        readPosts();
    }

    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(mFirebaseUser.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() {
        mSwipeRefreshLayout.setRefreshing(true);
        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) {

            }
        });

        mSwipeRefreshLayout.setRefreshing(false);
    }

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

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

        return isFollowingPublisher || isPublisher;
    }
}

1 Ответ

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

Это потому, что вы используете addValueEventListener. В этом случае ValueEventListener будет вызываться каждый раз при любых изменениях в этой иерархии.

Вы должны использовать addListenerForSingleValueEvent, если вам нужны данные только один раз. Другими словами, если вы не хотите обновления в реальном времени для узла, то вы используете addListenerForSingleValueEvent.

-> Ответ о mSwipeRefreshLayout.setRefreshing(false) позиционировании внутри readPost.

Прямо сейчас, как вы добавили mSwipeRefreshLayout.setRefreshing(true) и mSwipeRefreshLayout.setRefreshing(false) на самом деле бесполезны. Он немедленно позвонит .. Что вы должны сделать, это изменить состояние внутри слушателей.

private void readPosts() {
    mSwipeRefreshLayout.setRefreshing(true);
    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);
            mSwipeRefreshLayout.setRefreshing(false);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            mSwipeRefreshLayout.setRefreshing(false);
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...