Android firestore Pagination Recyclerview не загружается дважды - PullRequest
0 голосов
/ 18 октября 2019

У меня есть SearchFragment, содержащий Recyclerview, я использую Firestore для хранения своих данных.

Я попытался добавить разбиение на страницы в своем Recyclerview, я добавил 30 документов для проверки своего Recyclerview и установил ограничение на 10, мне удалось загрузить первые 10 документов на одной странице, а когда я прокручивал следующуюЗагружаются 10 документов и т. Д.

Проблема в том, что когда я перехожу к другому действию или фрагменту и возвращаюсь к SearchFragment, отображаются только первые 10 документов, а остальные нет.

Я анализирую код и обнаружил, что при прокрутке вниз и достижении последнего документа, переходе к другому действию или фрагменту и возвращении переменная isLastItemReached будет иметь значение true, а размер students_list равен 10 икод не доходят до второго запроса. Я пытаюсь решить эту проблему, но безуспешно.

SearchFragment.java

public class SearchFragment extends Fragment {
private static final String TAG = "TagSearchFragment";

private View rootView;

private DocumentSnapshot lastVisible;
private boolean isScrolling = false;
private boolean isLastItemReached = false;
private LinearLayoutManager linearLayoutManager;
private int limit_size = 10;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.fragment_search, container, false);
    Log.d(TAG, "onCreateView: ");
    setHasOptionsMenu(true);
    ((MainActivity) getActivity()).getSupportActionBar().setTitle("");

    final RecyclerView recyclerView = rootView.findViewById(R.id.rc_students_xml);
    recyclerView.setHasFixedSize(true);
    linearLayoutManager = new LinearLayoutManager(getContext());
    recyclerView.setLayoutManager(linearLayoutManager);

    Query query = FirebaseFirestore.getInstance()
            .collection("students").orderBy("time", Query.Direction.DESCENDING).startAt(lastVisible).limit(limit_size);

    query.get().addOnCompleteListener(getActivity(), new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                final ArrayList<Student> students_list = new ArrayList<>();

                for (DocumentSnapshot documentSnapshot : task.getResult()) {
                    Student list = documentSnapshot.toObject(Student.class);
                    students_list.add(list);
                }
                final AdapterStudent mAdapter = new AdapterStudent(getActivity(), students_list);
                recyclerView.setAdapter(mAdapter);
                lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);
                Toast.makeText(getActivity(), "First", Toast.LENGTH_SHORT).show();

                RecyclerView.OnScrollListener s = new RecyclerView.OnScrollListener() {
                    @Override
                    public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                        super.onScrollStateChanged(recyclerView, newState);

                        if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
                            isScrolling = true;
                        }
                    }
                    @Override
                    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                        super.onScrolled(recyclerView, dx, dy);

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

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

                            Query nextQuery = FirebaseFirestore.getInstance().collection("students")
                                    .orderBy("time", Query.Direction.DESCENDING)
                                    .startAfter(lastVisible)
                                    .limit(limit_size);

                            nextQuery.get().addOnCompleteListener(getActivity(), new OnCompleteListener<QuerySnapshot>() {
                                @Override
                                public void onComplete(@NonNull Task<QuerySnapshot> t) {
                                    Log.d(TAG, "onComplete: is task sec " + t.isSuccessful());
                                    if (t.isSuccessful()) {
                                        for (DocumentSnapshot documentSnapshot : t.getResult()) {
                                            Student list = documentSnapshot.toObject(Student.class);
                                            students_list.add(list);
                                        }

                                        mAdapter.notifyDataSetChanged();
                                        lastVisible = t.getResult().getDocuments().get(t.getResult().size() - 1);

                                        Toast.makeText(getActivity(), "second", Toast.LENGTH_SHORT).show();

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

                                    }
                                }
                            });
                        }
                    }
                };
                recyclerView.addOnScrollListener(s);

            }
        }
    });
    return rootView;
}


}

AdapterStudent.java

public class AdapterStudent  extends RecyclerView.Adapter<HolderSearch> {

private ArrayList<Student> students_list;

private Context mContext;

public AdapterStudent (Context context, ArrayList<Student> students_list) {
    this.mContext = context;
    this.students_list = students_list;
}


@NonNull
@Override
public HolderSearch onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_students, parent, false);
    return new HolderSearch(view );
}

@Override
public void onBindViewHolder(@NonNull HolderSearch holder, int position) {
    Student s = students_list.get(position);
    holder.tv_item_search_username.setText(s.getStudentName());
    Date date = s.getTime();
    if (date != null) {
        holder.tv_item_date.setText(DaysAgoFormatter.getTimeAgo(date.getTime()));
    }
}

@Override
public int getItemCount() {
    return students_list.size();
}

}

фрагмент_поиск.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com     /apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
>
<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/rc_students_xml"
     android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="50dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />



</androidx.constraintlayout.widget.ConstraintLayout>
...