8

मैं एक ऐप बना रहा हूं जो फायरबेस पर संग्रहीत वीडियो दिखाएगा। वीडियो की सूची को एक समय में हाल ही के 20 वीडियो लाने के लिए पृष्ठांकित किया जाना चाहिए।फायरबेस एंड्रॉइड पेजिनेशन

enter image description here

यहाँ कोड मैंने सोचा था कि

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

    } 

काम करेगा है लेकिन कोड ऊपर सीमित वीडियो के बजाय वीडियो की पूरी सूची प्राप्त करता है। पेजिनेशन कैसे लागू किया जा सकता है।

+0

क्या आपको पेजिंग करने के लिए दूर मिला है? – Raghunandan

+1

क्या आपको अंकन के लिए कुछ मिला? मुझे फायरबेस का उपयोग करके अपने आवेदन में पेजिनेशन को भी लागू करने की आवश्यकता है। –

उत्तर

6

नीचे जो पहले नवीनतम नोड से पता चलता कोड पृष्ठांकन के लिए उपयोग किया जा रहा है।

 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); 
     } 
    } 
+0

COuld u कृपया मुझे बताएंअधिक छवियां() आपकी ओवरराइड विधि है ??? मैं आपके द्वारा उपयोग की जाने वाली पेजिनेशन अवधारणा का भी उपयोग करना चाहता हूं .. आपका ऑनलोड और कार्यक्षमता कहां है ?? –

+0

खंड मेरे कोड में इंटरफ़ेस लागू करता है। आप @override नोटेशन –

+0

को हटा सकते हैं क्या आप कृपया बता सकते हैं कि '.onNoMoreImages(); 'है? धन्यवाद –

3

आप सीमित संख्या का परिणाम पुनर्प्राप्त करने के लिए सीमा का उपयोग करना चाहते हैं। सबसे पहले/सीमाएं सीमित विधियों को पुनर्प्राप्त करने के लिए।

videosQuery.orderByKey().limitToFirst(20) 

https://www.firebase.com/docs/web/api/query/limittofirst.html

आप वास्तव में अपने वीडियो के नामकरण परंपरा को बदलने प्रमुख 0s शामिल करने के लिए विचार करना चाहिए (यानी video01, video02 ... video10, video11) क्योंकि उपरोक्त कोड उन्हें वास्तव में आप के रूप में प्रदर्शित करेगा उन्हें ऊपर (जो मुझे लगता है कि आदेश से बाहर है?)

वैकल्पिक रूप से, यदि आप जावा के माध्यम से वीडियो जोड़ रहे हैं, तो आप केवल पुशबेस को पुश() के माध्यम से अद्वितीय बना सकते हैं। अनूठा इस तरह से उत्पन्न होते हैं कि वे क्रमिक रूप से क्रमबद्ध होंगे, जो ऐसा लगता है कि यह सबसे हालिया (ly जोड़ा?) वीडियो को पकड़ने की आपकी आवश्यकता के अनुरूप होगा।

https://www.firebase.com/docs/web/api/firebase/push.html

+0

videosQuery.orderByKey()। सीमाToLast (2) का उपयोग करने का प्रयास किया; ChildEventListener के साथ और अभी भी पृष्ठांकित प्रतिक्रिया प्राप्त करने में सक्षम नहीं है। –

+1

यह वास्तव में अंकन का उत्तर नहीं है। यह केवल अंतिम एक्स फिल्मों के लिए एक बार प्रतिक्रिया को सीमित करता है। – alltooconfusingthereforesleep

4
mPageEndOffset = 0; 
mPageLimit = 10; 


mPageEndOffset += mPageLimit; 

deviceListQuery = mDatabase.child("users") 
.orderByChild("id").limitToFirst(mPageLimit).startAt(mPageEndOffset); 

deviceListQuery.addValueEventListener(YourActivity.this); 
+1

मुझे इसे किसी भी विचार के विपरीत, काम करने के लिए कोई समस्या है? http://stackoverflow.com/questions/40231335/how-to-paginate-firebase-from-the-last-items-to-the-first – Lion789

+0

उस फ़ील्ड को जोड़ें जिसमें डेटा के अवरोही मूल्य हो, पूर्व के लिए: unix_timestamp (या उलटा टाइमस्टैम्प) और अपनी चयन क्वेरी के साथ सीमाToLast() का उपयोग करें। हमें वास्तव में अंकन की आवश्यकता नहीं है क्योंकि फायरबेस क्वेरी निष्पादित होती है और तेज़ी से वापस आती है।मैं एकल प्रश्न में 1000 रिकॉर्ड्स प्राप्त करने के लिए एक क्वेरी का उपयोग करता हूं, अब तक –

+0

अनुभव करने में बहुत देर नहीं हुई है, कोई एक यूनिक्स_टिमस्टैम्प (या उल्टा टाइमस्टैम्प) कैसे संलग्न करेगा? वर्तमान में मैं निम्न विधि 'ServerValue.TIMESTAMP' – Zen

0

मैं पद्धति का अनुसरण किया है एक firebase वास्तविक समय डेटाबेस नोड के माध्यम से पृष्ठ पर अंक लगाना करने के लिए:

private void getUsers(String nodeId) { 
     Query query; 

     if (nodeId == null) 
      query = FirebaseDatabase.getInstance().getReference() 
        .child(Consts.FIREBASE_DATABASE_LOCATION_USERS) 
        .orderByKey() 
        .limitToFirst(mPostsPerPage); 
     else 
      query = FirebaseDatabase.getInstance().getReference() 
        .child(Consts.FIREBASE_DATABASE_LOCATION_USERS) 
        .orderByKey() 
        .startAt(nodeId) 
        .limitToFirst(mPostsPerPage); 

     query.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       UserModel user; 
       List<UserModel> userModels = new ArrayList<>(); 
       for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { 
        userModels.add(userSnapshot.getValue(UserModel.class)); 
       } 

       mAdapter.addAll(userModels); 
       mIsLoading = false; 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       mIsLoading = false; 
      } 
     }); 
    } 

हर बार जब मैं पृष्ठवार डेटा के तल तक पहुँचते हैं, मैं getUsers(mAdapter.getLastItemId()); फोन और फिर इसे के अगले सेट लाता है रिकॉर्ड।

मुझे लगता है कि आप https://blog.shajeelafzal.com/2017/12/13/firebase-realtime-database-pagination-guide-using-recyclerview/

0

पर जांच कर सकते हैं इस पर खुला स्रोत नमूना अनुप्रयोग के साथ एक पूरा गाइड लिखा है यह मैं कैसे firebase डेटाबेस से पृष्ठांकन लागू किया है। अगर हमारे पास 100 संदेश हैं तो एक मामले पर विचार करें। तो मैं पहले फायरबेस से पिछले 20 संदेशों को लोड करता हूं यानी 81 से 100 तक। फिर स्क्रॉल अप पर मैं getMoreMessages() फ़ंक्शन को अगले 20 संदेशों को लोड करने के लिए कॉल करता हूं जो 61 से 80 हैं और इसी तरह।

public class ChatActivity extends Activity { 

     String chat_id = ""; 
     long mTotalChildren = 0; 
     boolean loading = false; 
     ChildEventListener childEventListenerMain, childEventListenerPager; 
     ChatActivity mContext = ChatActivity.this; 
     MessageAdapter messageAdapter; 
     @BindView(R.id.pb_messages) 
     ProgressBar pb_messages; 
     @BindView(R.id.ll_audio) 
     LinearLayout llAudio; 
     @BindView(R.id.tv_record_time) 
     AppCompatTextView tvRecordTime; 
     @BindView(R.id.tv_cancel) 
     AppCompatTextView tvCancel; 
     @BindView(R.id.iv_send) 
     AppCompatImageView ivSend; 
     @BindView(R.id.iv_record) 
     AppCompatImageView ivRecord; 
     @BindView(R.id.ab_layout) 
     AppBarLayout abLayout; 
     @BindView(R.id.messages) 
     RecyclerView rvMessages; 
     @BindView(R.id.iv_chat_icon) 
     SimpleDraweeView ivChatIcon; 
     @BindView(R.id.iv_camera) 
     AppCompatImageView ivCamera; 
     @BindView(R.id.iv_gallery) 
     AppCompatImageView ivGallery; 
     @BindView(R.id.message_input) 
     AppCompatEditText messageInput; 
     @BindView(R.id.tv_send) 
     AppCompatTextView tvSend; 
     @BindView(R.id.toolbar_title) 
     AppCompatTextView toolbarTitle; 
     @BindView(R.id.toolbar_status) 
     AppCompatTextView toolbarStatus; 
     @BindView(R.id.ll_send) 
     LinearLayout llSend; 
     int categoryId, senderId, receiverId, offerId; 
     String mLastKey; 
     LinearLayoutManager layoutManager; 
     private ArrayList<MessageModel> messageArrayList = new ArrayList<>(); 
     private ArrayList<MessageModel> tempMessageArrayList = new ArrayList<>(); 

     @Override 
     public int getLayoutId() { 
      return R.layout.activity_chat; 
     } 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      messageAdapter = new MessageAdapter(mContext, messageArrayList) { 

      }; 

      layoutManager = new LinearLayoutManager(mContext); 

      rvMessages.setLayoutManager(layoutManager); 
      rvMessages.setItemAnimator(new DefaultItemAnimator()); 
      rvMessages.setAdapter(messageAdapter); 
      rvMessages.setHasFixedSize(true); 

      rvMessages.addOnScrollListener(new RecyclerView.OnScrollListener() { 
       @Override 
       public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
        super.onScrollStateChanged(recyclerView, newState); 
       } 

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

        if (messageArrayList.size() >= 20 && 
          !loading && layoutManager.findFirstVisibleItemPosition() == 0 && messageArrayList.size() < mTotalChildren) { 

         loading = true; 
         getMoreMessages(); 
        } 
       } 
      }); 

      messageAdapter.notifyDataSetChanged(); 

      //used to scroll up recyclerview when keyboard pops up 
      rvMessages.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
       @Override 
       public void onLayoutChange(View view, int left, int top, int right, int bottom, 
              int oldLeft, int oldTop, int oldRight, int oldBottom) { 
        if (bottom < oldBottom) { 
         rvMessages.postDelayed(new Runnable() { 
          @Override 
          public void run() { 
           rvMessages.scrollToPosition(messageArrayList.size() - 1); 
          } 
         }, 100); 
        } 
       } 
      }); 

      loading = true; 
      getMessages(); 
     } 

     public void getMessages() { 

      FirebaseDatabase.getInstance().getReference().child(pathtomsgs).addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        Log.e("childrenCount", String.valueOf(+dataSnapshot.getChildrenCount())); 
        mTotalChildren = dataSnapshot.getChildrenCount(); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 


      Query messageQuery = FirebaseDatabase.getInstance().getReference().child(pathtomsgs).limitToLast(20); 

      childEventListenerMain = new ChildEventListener() { 
       @Override 
       public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

        loading = true; 
        MessageModel messageModel = dataSnapshot.getValue(MessageModel.class); 
        if (messageModel != null) { 
         messageModel.chat_id = chat_id; 
         messageModel.message_id = dataSnapshot.getKey(); 
         messageArrayList.add(messageModel); 
         messageAdapter.notifyDataSetChanged(); 
         mLastKey = messageArrayList.get(0).message_id; 
         rvMessages.scrollToPosition(messageArrayList.size() - 1); 
        } 
       } 

       @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) { 
        Toast.makeText(mContext, "Problem loading more images...", Toast.LENGTH_LONG).show(); 
       } 
      }; 

      messageQuery.addChildEventListener(childEventListenerMain); 

      ValueEventListener messageChildSINGLEValueEventListener = new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        pb_messages.setVisibility(View.GONE); 
        System.out.println("We're done loading messages " + dataSnapshot.getChildrenCount() + " items"); 
        loading = false; 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }; 

      messageQuery.addListenerForSingleValueEvent(messageChildSINGLEValueEventListener); 
     } 

     public void getMoreMessages() { 
      tempMessageArrayList.clear(); 

      Query messageQuery = FirebaseDatabase.getInstance().getReference().child(pathtomsgs).orderByKey().endAt(mLastKey).limitToLast(20); 

      childEventListenerPager = new ChildEventListener() { 
       @Override 
       public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
        loading = true; 
        MessageModel messageModel = dataSnapshot.getValue(MessageModel.class); 
        if (messageModel != null) { 

         messageModel.chat_id = chat_id; 
         messageModel.message_id = dataSnapshot.getKey(); 
         tempMessageArrayList.add(messageModel); 
        } 
       } 

       @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) { 
        Toast.makeText(mContext, "Problem loading more images...", Toast.LENGTH_LONG).show(); 
       } 
      }; 

      messageQuery.addChildEventListener(childEventListenerPager); 

      ValueEventListener messageChildSINGLEValueEventListener = new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        System.out.println("We're done loading messages " + dataSnapshot.getChildrenCount() + " items"); 

        tempMessageArrayList.remove(tempMessageArrayList.size() - 1); 

        messageArrayList.addAll(0, tempMessageArrayList); 
        mLastKey = messageArrayList.get(0).message_id; 
        messageAdapter.notifyDataSetChanged(); 
        //rvMessages.scrollToPosition(20); 
        layoutManager.scrollToPositionWithOffset(19, 0); 
        loading = false; 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }; 

      messageQuery.addListenerForSingleValueEvent(messageChildSINGLEValueEventListener); 
     } 


     @Override 
     protected void onDestroy() { 

      FirebaseDatabase.getInstance().getReference().child(pathtomsgs).removeEventListener(childEventListenerPager); 
      FirebaseDatabase.getInstance().getReference().child(pathtomsgs).removeEventListener(childEventListenerMain); 

      super.onDestroy(); 
     } 
    } 
संबंधित मुद्दे