Я создаю приложение, которое покажет видео, хранящееся на firebase. Список видеороликов должен быть разбит на страницы, получая последние 20 видео за раз.
Вот код, который, как я думал, будет работать
private void getVideos() { Query videosQuery = FirebaseUtil.getVideosRef(); videosQuery.startAt(0); videosQuery.endAt(1); ChildEventListener videosChildEventListener = new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { String date = dataSnapshot.getKey(); String temp = date; } @Override public void onChildChanged(DataSnapshot dataSnapshot, String s) { } @Override public void onChildRemoved(DataSnapshot dataSnapshot) { } @Override public void onChildMoved(DataSnapshot dataSnapshot, String s) { } @Override public void onCancelled(DatabaseError databaseError) { Log.d(tag, "database error"); } }; ValueEventListener videoValueEventListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String date = dataSnapshot.getKey(); String temp = date; long count = dataSnapshot.getChildrenCount(); String value = dataSnapshot.getValue().toString(); temp = value; } @Override public void onCancelled(DatabaseError databaseError) { Log.d(tag, "database error"); } }; // videosQuery.addChildEventListener(videosChildEventListener); videosQuery.addValueEventListener(videoValueEventListener); }
Но выше код извлекает весь список видео, а не ограниченные видео. Как можно выполнить разбиение на страницы.
mPageEndOffset = 0; mPageLimit = 10; mPageEndOffset += mPageLimit; deviceListQuery = mDatabase.child("users") .orderByChild("id").limitToFirst(mPageLimit).startAt(mPageEndOffset); deviceListQuery.addValueEventListener(YourActivity.this);
Ниже приведен код, который я использую для разбивки на страницы, который показывает последний узел.
public void getImages() { Query imagesQuery = FirebaseDatabase.getInstance().getReference().child("englishDps").child(mChildName).orderByKey().limitToLast(21); ChildEventListener childEventListener = new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { Image image = dataSnapshot.getValue(Image.class); image.setNodeKey(dataSnapshot.getKey()); mTempImages.add(image); if (mTempImages.size() == 21) { mLastKey = mTempImages.get(0).getNodeKey(); Collections.reverse(mTempImages); mTempImages.remove(mTempImages.size() - 1); mImages.addAll(mTempImages); setAdapter(); } } @Override public void onChildChanged(DataSnapshot dataSnapshot, String s) { } @Override public void onChildRemoved(DataSnapshot dataSnapshot) { } @Override public void onChildMoved(DataSnapshot dataSnapshot, String s) { } @Override public void onCancelled(DatabaseError databaseError) { if (isAdded()) { Toast.makeText(getActivity(), "Problem loading more images...", Toast.LENGTH_LONG).show(); } } }; imagesQuery.addChildEventListener(childEventListener); } @Override public void getMoreImages() { if (!mGettingMoreImages) { mGettingMoreImages = true; Query imagesQuery = FirebaseDatabase.getInstance().getReference("englishDps").child(mChildName).orderByKey().endAt(mLastKey).limitToLast(21); ChildEventListener childEventListener = new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { Image image = dataSnapshot.getValue(Image.class); image.setNodeKey(dataSnapshot.getKey()); mMoreImages.add(image); if (mMoreImages.size() == 21) { mLastKey = mMoreImages.get(0).getNodeKey(); Collections.reverse(mMoreImages); mMoreImages.remove(mMoreImages.size() - 1); mImages.addAll(mMoreImages); mMoreImages.clear(); mGettingMoreImages = false; mImagesAdapter.notifyDataSetChanged(); return; } if (mLastKey.equalsIgnoreCase(image.getNodeKey())) { Collections.reverse(mMoreImages); mImages.addAll(mMoreImages); mMoreImages.clear(); mGettingMoreImages = false; mImagesAdapter.onNoMoreImages(); ; mImagesAdapter.notifyDataSetChanged(); } } @Override public void onChildChanged(DataSnapshot dataSnapshot, String s) { } @Override public void onChildRemoved(DataSnapshot dataSnapshot) { } @Override public void onChildMoved(DataSnapshot dataSnapshot, String s) { } @Override public void onCancelled(DatabaseError databaseError) { if (isAdded()) { Toast.makeText(getActivity(), "Problem loading more images...", Toast.LENGTH_LONG).show(); } } }; imagesQuery.addChildEventListener(childEventListener); } }
Вы хотите использовать методы limitToFirst / limitToLast для получения ограниченного количества результатов.
videosQuery.orderByKey().limitToFirst(20)
https://www.firebase.com/docs/web/api/query/limittofirst.html
Вы должны действительно рассмотреть возможность изменения соглашения об именах ваших видеороликов с включением ведущих 0 (т. Е. Video01, video02 … video10, video11), потому что приведенный выше код отобразит их точно так же, как вы их используете выше (что, я полагаю, не соответствует порядку?)
Кроме того, если вы добавляете видео через Java, вы можете просто позволить firebase создавать уникальные объекты с помощью push (). Уникальные генерируются таким образом, что они будут сортироваться хронически, что звучит так, как вам подойдет, чтобы захватить самые последние видео (добавленные?).