android - मैं अपने एडेप्टर के लिए फायरबेस से डेटा कैसे प्राप्त कर सकता हूं




firebase firebase-realtime-database (2)

इसका बेहतर है कि आप रिसाइकलर दृश्य के लिए अपने ViewBinder के अंदर किसी भी फायरबेस कॉल को शामिल न करें आप क्या कर सकते हैं अपने BlogPost को अपडेट करें और इसमें गेट्टर और सेटर के साथ एक फ़ील्ड नाम शामिल करें। फिर अपनी गतिविधि के अंदर जहाँ आप BlogPost को रिसाइकलर एडॉप्टर में जोड़ रहे हैं, आप उपयोगकर्ता नाम को ब्लॉग पोस्ट में नाम जोड़ सकते हैं और डेटा परिवर्तन के एडेप्टर को सूचित कर सकते हैं।

अपनी गतिविधि में ऐसा करें

// adding BlogPost to list
// Create BlogPost object with the data.
blogList.add(blogPostObject)
firebaseDatabase.child("Users").child(user_id).child("name").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists()){
              blogPostObject.setName(dataSnapshot.getValue().toString());
              adapter..notifyItemChanged(indexOfblogPostObject);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

मेरी संरचना

इसलिए मेरे पास एक ऐप है जिसमें उपयोगकर्ता अपने एडेप्टर में पोस्ट अपलोड करते हैं। मैं पोस्ट विवरण और पोस्ट चित्र को पुनः प्राप्त कर सकता हूं, लेकिन जब मैं पोस्टर के नाम को पुनः प्राप्त करने की कोशिश करता हूं, तो ऐप क्रैश होने लगता है, हर पोस्ट के साथ नाम को पुनः प्राप्त करने के लिए अपलोडर की आईडी के साथ डेटाबेस में एक बच्चा जोड़ा जाता है। यह मेरी क्लास फाइल है:

public String image_thumb;
public String user_id;
public String image_url;
public String desc;

public BlogPost(){}


public BlogPost(String user_id, String image_url, String desc, String image_thumb) {
    this.user_id = user_id;
    this.image_url = image_url;
    this.desc = desc;
    this.image_thumb = image_thumb;
}



public String getUser_id() {
    return user_id;
}

public void setUser_id(String user_id) {
    this.user_id = user_id;
}

public String getImage_url() {
    return image_url;
}

public void setImage_url(String image_url) {
    this.image_url = image_url;
}

public String getDesc() {
    return desc;
}

public void setDesc(String desc) {
    this.desc = desc;
}

public String getImage_thumb() {
    return image_thumb;
}

public void setImage_thumb(String image_thumb) {
    this.image_thumb = image_thumb;
}

और यह मेरे एडाप्टर में से कुछ है:

public void onBindViewHolder(final ViewHolder holder, int position) {

    String desc_data = blog_list.get(position).getDesc();
    holder.setDescText(desc_data);//this works

    String image_url = blog_list.get(position).getImage_url();
    holder.setBlogImage(image_url);//this works

    String user_id = blog_list.get(position).getUser_id();
    firebaseDatabase.child("Users").child(user_id).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists()){
                String userName = dataSnapshot.child("name").getValue().toString();

                holder.setUserName(userName);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    public void setUserName(String name){
        blogUserName = mView.findViewById(R.id.blog_user_name);
        blogUserName.setText(name);
    }

मैं मूल रूप से क्या करना चाहता हूं नाम के लिए user_id के अंदर देखो और इसे मेरे TextView अंदर पुनर्प्राप्त करें


इसे सही ढंग से काम करने के लिए, मैं आपको मॉडल वर्ग के साथ-साथ आपके कोड में कुछ बदलाव करने की सलाह देता हूं। आपका मॉडल वर्ग ऐसा दिखना चाहिए:

public class BlogPost {
    public String imageThumb, userId, imageUrl, desc;

    public BlogPost() {}

    public BlogPost(String imageThumb, String userId, String imageUrl, String desc) {
        this.imageThumb = imageThumb;
        this.userId = userId;
        this.imageUrl = imageUrl;
        this.desc = desc;
    }

    public String getImageThumb() {return imageThumb;}
    public String getUserId() {return userId;}
    public String getImageUrl() {return imageUrl;}
    public String getDesc() {return desc;}
}

कृपया फ़ील्ड्स और गेटर्स का नामकरण सम्मेलन देखें।

इसे काम करने के लिए, पुराने डेटा को हटाने और ताज़ा जोड़ने के लिए मत भूलना।

मान लें कि आपकी गतिविधि के लिए एक .XML फ़ाइल है जिसमें एक RecyclerView जो इस तरह दिखता है:

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/recycler_view"/>

और आपकी आइटम फ़ाइल के लिए एक .XML फ़ाइल, जो इस तरह दिखती है:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/image_thumb_text_view" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/user_id_text_view" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/image_url_text_view" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/desc_text_view" />
</LinearLayout>

अपना डेटा FriebaseRecyclerAdapter एक FriebaseRecyclerAdapter का उपयोग करके, कृपया अगले चरणों का पालन करें:

सबसे पहले, आपको अपनी गतिविधि में RecyclerView खोजने और इस तरह से LinearLayoutManager सेट करने की आवश्यकता है:

RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

फिर आपको अपने Firebase डेटाबेस और इस तरह से एक Query ऑब्जेक्ट का मूल संदर्भ बनाने की आवश्यकता है:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("Users");

फिर आपको इस तरह से एक FirebaseRecyclerOptions ऑब्जेक्ट बनाना होगा:

FirebaseRecyclerOptions<BlogPost> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<BlogPost>()
        .setQuery(query, BlogPost.class)
        .build();

अपनी गतिविधि कक्षा में, एक holder वर्ग बनाएँ जो इस तरह दिखता है:

private class BlogPostHolder extends RecyclerView.ViewHolder {
    private TextView imageThumbtextView, userIdTextView, imageUrlTextView, descTextView;

    BlogPostHolder(View itemView) {
        super(itemView);
        imageThumbtextView = itemView.findViewById(R.id.image_thumb_text_view);
        userIdTextView = itemView.findViewById(R.id.user_id_text_view);
        imageUrlTextView = itemView.findViewById(R.id.image_url_text_view);
        descTextView = itemView.findViewById(R.id.desc_text_view);
    }

    void setBlogPost(BlogPost blogPost) {
        String imageThumb = blogPost.getImageThumb();
        imageThumbtextView.setText(imageThumb);
        String userId = blogPost.getUserId();
        userIdTextView.setText(userId);
        String imageUrl = blogPost.getImageUrl();
        imageUrlTextView.setText(imageUrl);
        String desc = blogPost.getDesc();
        descTextView.setText(desc);
    }
}

फिर एक एडेप्टर बनाएं जिसे वैश्विक घोषित किया गया है:

private FirebaseRecyclerAdapter<BlogPost, BlogPostHolder> firebaseRecyclerAdapter;

और इसे अपनी गतिविधि में इस तरह से तत्काल करें:

firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<BlogPost, BlogPostHolder>(firebaseRecyclerOptions) {
    @Override
    protected void onBindViewHolder(@NonNull BlogPostHolder blogPostHolder, int position, @NonNull BlogPost blogPost) {
        blogPostHolder.setBlogPost(blogPost);
    }

    @Override
    public BlogPostHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);

        return new BlogPostHolder(view);
    }
};
recyclerView.setAdapter(firebaseRecyclerAdapter);

अंत में, निम्नलिखित दो विधियों को ओवरराइड करना न भूलें और परिवर्तनों के बारे में सुनना शुरू करें:

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

@Override
protected void onStop() {
    super.onStop();

    if (firebaseRecyclerAdapter!= null) {
        firebaseRecyclerAdapter.stopListening();
    }
}




firebase-realtime-database