回收者视图并不总是添加新项目

时间:2018-11-24 22:54:35

标签: android android-recyclerview pagination adapter

我在我的应用程序中使用了带有微调器的回收站视图。它加载有关物理,化学等不同主题的帖子。微调框包含物理和其他主题。微调器中的默认项目是“所有主题”,其中加载了所有问题。我正在使用无尽的回收器视图以在结束时加载新数据。在请求时,它运行良好,并且在更改微调器中的主题之后,新列表也运行良好,但是此后,当我第三次更改微调器中的主题时,新列表仅包含初始数据,并且不会加载当我滚动到末尾时,会获得更多数据。

这是我的演示者代码:

    public void getPosts(final String currentSubject) {
    postsList = new ArrayList<>();
    view.startRecyclerAdapter(postsList);
    view.showProgressBar();
    view.hideNoPostsText();
    view.notifyAdapter();

    OnCompleteListener postsListener = new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull final Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                for (DocumentSnapshot document : task.getResult()) {
                    getPostData(document);
                }

                if (postsList.size() == 0) {
                    view.onNoPostsExists();
                } else {
                    view.onDataFound();
                }

                if(task.getResult().size() > 0 ) {
                    lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);
                    lastPosition = task.getResult().size() - 1;
                }


                RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
                    @Override
                    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                        super.onScrollStateChanged(recyclerView, newState);
                        if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
                            isScrolling = true;
                        }
                    }

                    @Override
                    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                        super.onScrolled(recyclerView, dx, dy);

                        LinearLayoutManager linearLayoutManager = ((LinearLayoutManager) recyclerView.getLayoutManager());
                        int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
                        int visibleItemCount = linearLayoutManager.getChildCount();
                        int totalItemCount = linearLayoutManager.getItemCount();

                        if (isScrolling && (firstVisibleItemPosition + visibleItemCount == totalItemCount) && !isLastItemReached) {
                            isScrolling = false;

                            OnCompleteListener secondQueryCompleteListener = new OnCompleteListener<QuerySnapshot>() {
                                @Override
                                public void onComplete(@NonNull Task<QuerySnapshot> t) {
                                    if (t.isSuccessful()) {
                                        for (DocumentSnapshot d : t.getResult()) {
                                            getPostData(d);
                                        }
                                        view.notifyAdapter();

                                        if(t.getResult().size() > 0) {
                                            lastVisible = t.getResult().getDocuments().get(t.getResult().size() - 1);
                                            lastPosition += 5;
                                        }

                                        Log.v("LoggingPosition", "last position is : " + lastPosition);

                                        if (t.getResult().size() < limit) {
                                            isLastItemReached = true;
                                        }
                                    }
                                }
                            };

                            if (currentSubject.equals("كل المواد")) {
                                Query nextQuery = fireStorePosts.orderBy("date", Query.Direction.DESCENDING)
                                        .startAfter(lastVisible).limit(limit);
                                nextQuery.get().addOnCompleteListener(secondQueryCompleteListener);
                            }
                            else {
                                Query nextQuery = fireStorePosts.whereEqualTo("subject", currentSubject)
                                        .orderBy("date", Query.Direction.DESCENDING).startAfter(lastVisible).limit(limit);
                                nextQuery.get().addOnCompleteListener(secondQueryCompleteListener);
                            }
                        }
                    }
                };
                view.setOnScrollListener(onScrollListener);


            } else {
                Log.v("TAG", "failed");
            }
        }
    };

    if (currentSubject.equals("كل المواد")) {
        firstQuery = fireStorePosts.orderBy("date", Query.Direction.DESCENDING).limit(limit);
        firstQuery.get().addOnCompleteListener(postsListener);
    } else {
        firstQuery = fireStorePosts.whereEqualTo("subject", currentSubject)
                .orderBy("date", Query.Direction.DESCENDING).limit(limit);
        firstQuery.get().addOnCompleteListener(postsListener);
    }
}

这是我认为的相关方法:

@Override
public void notifyAdapter() {
    recyclerAdapter.notifyDataSetChanged();
}

@Override
public void setOnScrollListener(RecyclerView.OnScrollListener onScrollListener) {
    recyclerView.addOnScrollListener(onScrollListener);
}

0 个答案:

没有答案