У меня есть 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>