2017-08-05 19 views
5

मेरे ऐप में प्रत्येक उपयोगकर्ता मित्र अनुरोध भेज सकता है और प्राप्त कर सकता है। जब उपयोगकर्ता अपने दोस्तों के अनुरोधों की जांच करता है, तो मैं चाहता हूं कि ऐप प्रत्येक उपयोगकर्ता के माध्यम से जाए जिसने उसे एक मित्र अनुरोध भेजा और Realtime Database से अपनी जानकारी पुनर्प्राप्त की।फ़ायरबेस - प्रत्येक उपयोगकर्ता के डेटा को एक सूची में पुनर्प्राप्त करने का प्रयास

public void check_For_Friends_And_Requests(){ 
     String loggedUser=SaveSharedPreference.getLoggedEmail(getApplicationContext()); 


      final DatabaseReference mDatabase= FirebaseDatabase.getInstance().getReference(); 
      final DatabaseReference userRef=mDatabase.child("Users").child(loggedUser); 

      userRef.addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        if (dataSnapshot.exists()){ 

         final List<User> friendRequestsReceived_UserList=new ArrayList<>(); 

         for (DataSnapshot postSnapshot: dataSnapshot.child("friend_requests_received").getChildren()) { 

          final String senderEmail=postSnapshot.getKey(); 

          Toast.makeText(getApplicationContext(), 
            senderEmail, Toast.LENGTH_SHORT).show(); 

          if (senderEmail!=null){ 
           mDatabase.child("Users").child(senderEmail).addListenerForSingleValueEvent(new ValueEventListener() { 
            @Override 
            public void onDataChange(DataSnapshot dataSnapshot) { 
             Toast.makeText(getApplicationContext(), 
               dataSnapshot.child("name").getValue(String.class), Toast.LENGTH_SHORT).show(); 

             friendRequestsReceived_UserList.add(
               new User(
                 senderEmail, 
                 dataSnapshot.child("name").getValue(String.class), 
                 dataSnapshot.child("level").getValue(Integer.class), 
                 dataSnapshot.child("skill").getValue(Double.class))); 

            } 

            @Override 
            public void onCancelled(DatabaseError databaseError) { 

            } 
           }); 

          } 
         } 

         UserListAdapter friendRequestsReceived_Adapter = 
         new UserListAdapter(getApplicationContext(), 
           R.layout.friend_requests_received_listview_row, 
           friendRequestsReceived_UserList); 

         friendRequestsReceived_ListView.setAdapter(friendRequestsReceived_Adapter); 

        } 

        else 
        connectionErrorGoToMain(); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        connectionErrorGoToMain(); 
       } 
      }); 


    } 

मैं इस कोड 2 ValueEventListeners में है:

इस आदेश यह पूरा करने में मेरी कोड है। मैं उपयोगकर्ता की जानकारी को आंतरिक में सूची में जोड़ता हूं। समस्या यह है कि इस प्रक्रिया के अंत में सूची खाली है।

मैं इस जानकारी का उपयोग कर इन पंक्तियों के साथ एक सूची दृश्य को भरने के लिए करना चाहते हैं:

UserListAdapter friendRequestsReceived_Adapter = 
         new UserListAdapter(getApplicationContext(), 
           R.layout.friend_requests_received_listview_row, 
           friendRequestsReceived_UserList); 

         friendRequestsReceived_ListView.setAdapter(friendRequestsReceived_Adapter); 

जब मैं उन्हें innner श्रोता के अंदर डाल दिया, यह ठीक काम करता है, लेकिन मैं अनुकूलक स्थापित करने के लिए नहीं करना चाहते हैं सूची में प्रत्येक उपयोगकर्ता के लिए, केवल for लूप के बाद।

मैं अपने डेटाबेस संरचना के साथ एक स्क्रीनशॉट (मैं मानकों के सभी प्राप्त करने की आवश्यकता नहीं है) संलग्न कर रहा हूँ:

enter image description here

+0

मुझे तुम्हारी जरूरत है देखने के लिए अपने Firebase डेटा संरचना –

+0

@ILAYS_Kerbal मैं एक स्क्रीनशॉट –

+0

जोड़ दिया है सब आप कर सकते हैं .... कक्षा उपयोग { सूची friendReuqest = नए तरह प्रत्येक वस्तु के साथ स्टोर सूची है सारणी सूची(); स्ट्रिंग नाम; } और आपके ओन्डाटा परिवर्तन में श्रोता मित्र पर एक नेस्टेड क्वेरी करें रिक्वेस्ट बच्चे और डेटा पास करें स्नैपशॉट करें और फिर अपने मॉडल पर सेट करें, पहले सूची प्राप्त करें और फिर अपने मॉडल में सूची जोड़ें और इसे उपयोगकर्ता सूची में रखें डेटा स्नैपशॉट.getValue (उपयोगकर्ता। कक्षा), –

उत्तर

1

सूची रिक्त है क्योंकि आप भीतरी onDataChange() बाहर friendRequestsReceived_UserList की घोषणा कर रहे हैं तरीका। यह onDataChange() विधि के असीमित व्यवहार के कारण हो रहा है जिसे आप सूची में उन नई वस्तुओं को जोड़ने से पहले बुलाए जाते हैं। तो, यह हल करने के लिए, बस सूची की घोषणा भीतरी onDataChange() विधि के अंदर इस तरह के लिए कदम:

if (senderEmail!=null){ 
mDatabase.child("Users").child(senderEmail).addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     final List<User> friendRequestsReceived_UserList=new ArrayList<>(); //Moved here 

    Toast.makeText(getApplicationContext(), dataSnapshot.child("name").getValue(String.class), Toast.LENGTH_SHORT).show(); 

    friendRequestsReceived_UserList.add(
     new User(
      senderEmail, 
      dataSnapshot.child("name").getValue(String.class), 
       dataSnapshot.child("level").getValue(Integer.class), 
      dataSnapshot.child("skill").getValue(Double.class))); 
      UserListAdapter friendRequestsReceived_Adapter = 

    new UserListAdapter(getApplicationContext(), R.layout.friend_requests_received_listview_row, friendRequestsReceived_UserList); 
    friendRequestsReceived_ListView.setAdapter(friendRequestsReceived_Adapter); 

    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 

आप शायद यह देखने के रूप में, मैं भी एडाप्टर सेट भीतरी विधि के अंदर। यदि आप onDataChange() के बाहर उस सूची का उपयोग करना चाहते हैं तो मैं आपको इस post से अपना उत्तर पढ़ने का सुझाव देता हूं।

+0

यदि मैं एडाप्टर को अंदरूनीडेटाडेटा() में सेट करने वाला हूं, तो मैं इसे "फॉर" लूप के अंदर सेट कर रहा हूं, और वास्तव में इसे प्रत्येक ऑब्जेक्ट के लिए सेट कर दूंगा। जब मैं ऑब्जेक्ट से भरा हुआ हूं, तो "लूप" के बाद, मैं इसे केवल एक बार सेट करना चाहता हूं। –

+0

आप इसे अपने डेटाबेस संरचना से प्राप्त नहीं कर सकते हैं क्योंकि आपको नेस्टेड प्रश्नों का उपयोग करने की आवश्यकता है, जिसका अर्थ है कि आपको डेटा को दो बार अतुल्यकालिक लोड करना होगा। यदि आप उस सूची का उपयोग 'onDataChange()' विधि के बाहर करते हैं (मैटर नहीं है) यह हमेशा शून्य होगा। आपके पास 2 संभावनाएं हैं इस [पोस्ट] (https://stackoverflow.com/questions/44152775/how-to-get-value-async-in-outside-method-ondatachange) से मेरा उत्तर उपयोग करने के लिए, जो पूरी तरह से काम करता है या आपकी डेटाबेस संरचना को बदलने के लिए जिसमें केवल एक प्रश्न की आवश्यकता है। –

+0

मुझे समझ में नहीं आ रहा है, क्या इस पोस्ट में आपका जवाब मुझे "फॉर" लूप के बाद एडाप्टर डालने में मदद करता है? अगर ऐसा होता है, तो मुझे यह नहीं मिलता है। यह मेरे कोड में कोड से कोड को लागू करने का मेरा प्रयास है: https://pastebin.com/fgWhNpDv –

संबंधित मुद्दे

 संबंधित मुद्दे