java - FirebaseListAdapter चैट ऐप के लिए अलग-अलग आइटम नहीं धकेल रहा है-Firebase-Ui 3.1




android firebase-realtime-database (2)

मैं एंड्रॉइड पर एक चैट ऐप बना रहा हूं जो उपयोगकर्ताओं को एक-दूसरे को लिखने वाले संदेशों को संग्रहीत करने के लिए Google फायरबेस का उपयोग करता है। इन संदेशों को उपयोगकर्ताओं को प्रदर्शित करने के लिए मैंने उन्हें डेटाबेस से पढ़ा और उन्हें एक कस्टम लिस्ट व्यू में एक सूची एडेप्टर के साथ व्यवस्थित किया। यह तब तक ठीक काम कर रहा था जब तक मैंने अपनी निर्भरता को अपडेट नहीं किया, विशेष रूप से फायरबेस ui को:

com.firebaseui:firebase-ui:3.1.0

अब सूची एडॉप्टर के निर्माण के लिए कोड काम नहीं करता है:

adapter = new FirebaseListAdapter<ChatMessage>(FirebaseDatabase.getInstance().getReference("Lobbies").child(leaderID).child("Messages"), ChatMessage.class, R.layout.message, this) {
        @Override
        protected void populateView(View v, ChatMessage model, int position) {
            // Get references to the views of message.xml
            TextView messageText = (TextView)v.findViewById(R.id.message_text);
            TextView messageUser = (TextView)v.findViewById(R.id.message_user);
            TextView messageTime = (TextView)v.findViewById(R.id.message_time);

            // Set their text
            messageText.setText(model.getMessageText());
            messageUser.setText(model.getMessageUser());

            // Format the date before showing it
            messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)",
                    model.getMessageTime()));
        }
    };

इस समस्या को हल करने के लिए, मैंने कोड को नई फायरबेस ui आवश्यकताओं के अनुरूप बनाया, जिससे कोड बन गया:

FirebaseListOptions<ChatMessage> options = new FirebaseListOptions.Builder<ChatMessage>()
            .setQuery(FirebaseDatabase.getInstance().getReference("Lobbies").child(leaderID).child("Messages"), ChatMessage.class).setLayout(R.layout.message).build();

    adapter = new FirebaseListAdapter<ChatMessage>(options) {
        @Override
        protected void populateView(View v, ChatMessage model, int position) {
            // Get references to the views of message.xml
            TextView messageText = v.findViewById(R.id.message_text);
            TextView messageUser = v.findViewById(R.id.message_user);
            TextView messageTime = v.findViewById(R.id.message_time);

            // Set their text
            messageText.setText(model.getMessageText());
            messageUser.setText(model.getMessageUser());

            // Format the date before showing it
            messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)",
                    model.getMessageTime()));
        }
    };

यह कोड अब ठीक संकलित करता है, लेकिन सूची दृश्य डेटा प्रदर्शित नहीं कर रहा है। क्या सूची एडाप्टर बनाने के लिए नए फायरबेस ui निर्भरता का उपयोग करने का एक विशिष्ट सही तरीका है?


FirebaseRecyclerAdapter और FirebaseListAdapter को गतिविधि पर डेटा दिखाने के लिए

आपको इसका उपयोग करने की आवश्यकता है:

@Override
protected void onStart() {
super.onStart();
adapter.startListening();
}


@Override
protected void onStop() {
super.onStop();
adapter.stopListening();
}

चूंकि FirebaseListAdapter एक श्रोता का उपयोग फायरबेस डेटाबेस में परिवर्तनों की जांच के लिए करता है, तो डेटा के लिए सुनने के लिए आपको onStart() अंदर onStart() . onStart() को जोड़ने की आवश्यकता होती है, onStart() डेटा को सूची में दिखाया जा सके।

तब onStop() (जब गतिविधि बंद हो जाती है) के अंदर, आप एडेप्टर में श्रोता और डेटा को हटाने के लिए onStop() उपयोग कर सकते हैं।

अधिक जानकारी के लिए इसे देखें: एडॉप्टर लाइफसाइकल

ध्यान दें:

यदि उपरोक्त का उपयोग करने के बाद, आपको एक nullpointexception मिलता है या cannot resolve symbol , तो आपको adapter को वैश्विक चर घोषित करना होगा और कृपया नीचे दिए गए उत्तर की जांच करें: StartListening में त्रुटि ()


पीटरबी के उत्तर में जो कहा गया है, इसके अलावा, फायरबेससेरेक्लेरएडएटर के अनुसार, नवीनतम एपि documentation , आप FirebaseRecyclerOptions उदाहरण में गुजरने वाले एक FirebaseRecyclerAdapter निर्माण कर सकते हैं जो एक बिल्डर द्वारा बनाया गया है। बिल्डर में आप एक जीवन चक्र के मालिक को निर्दिष्ट करते हैं ताकि आपको या तो इसके onStart या इसके onStop मैन्युअल रूप से संशोधित न करना onStop :

private fun MainActivity.setUpFirebaseRecyclerAdapter():
    FirebaseRecyclerAdapter<User, ListOnlineViewHolder> {

val options = FirebaseRecyclerOptions.Builder<User>()
        .setQuery(ONLINE_USERS.limitToLast(10), User::class.java)
        .setLifecycleOwner(this)
        .build()

return object : FirebaseRecyclerAdapter<User, ListOnlineViewHolder>(options){
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListOnlineViewHolder {
        return ListOnlineViewHolder(
                LayoutInflater.from(parent.context)
                        .inflate(R.layout.user_layout, parent, false))
    }
    override fun onBindViewHolder(holder: ListOnlineViewHolder, position: Int, model: User) {
        holder.bindMessage(model)
    }
}
}

विकल्प बिल्डर एक सेटिवि विधि से बना है जो db और एक मॉडल ऑब्जेक्ट के संदर्भ में लेता है; setLifecycleOwner जो एडेप्टर अपडेट को ट्रिगर करेगा गतिविधि में लेता है।





firebaseui