如何从Firebase检索数据到适配器 [英] How can I retrieve data from Firebase to my adapter
问题描述
我的结构
因此,我有一个应用程序,用户可以在其中上载适配器中的帖子.我可以检索帖子说明和帖子图片,但是当我尝试检索发布者的名称时,应用似乎崩溃了,要在每篇文章中检索名称,都会在数据库中添加一个带有上载者ID的孩子.这是我的课程文件:
So I have an app in which users upload posts in my adapter. I can retrieve the post description and the post picture, but when I try to retrieve the poster's name the app seems to crash, to retrieve the name with every post there is a child added to the database with the uploader's id. This is my class file:
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
What I basically wanna do is look inside the user_id for the name and retrieve it inside my TextView
推荐答案
为了使其正常工作,建议您在模型类以及代码中进行一些更改.您的模型类应如下所示:
In order to make it work correctly, I recommend you to do some changes in you model class as well as in your code. Your model class should look like:
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;}
}
请参阅字段和获取方法的命名约定.
Please see the naming convention of the fields and getters.
为了使其正常工作,请不要忘记删除旧数据并添加新数据.
In order to make it work, don't forget the remove the old data and add fresh one.
假设您的活动有一个.XML文件,其中包含一个如下所示的RecyclerView
:
Assuming your have a .XML file for your activity that contains a RecyclerView
which looks like this:
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recycler_view"/>
还有一个用于您的项目文件的.XML文件,如下所示:
And a .XML file for your item file, which looks like this:
<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
在RecyclerView
中显示数据,请按照以下步骤操作:
To display your data in a RecyclerView
using a FriebaseRecyclerAdapter
, please follow the next steps:
首先,您需要在活动中找到RecyclerView
并像这样设置LinearLayoutManager
:
First, you need to find the RecyclerView
in your activity and set the LinearLayoutManager
like this:
RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
然后,您需要创建Firebase数据库的根引用和如下的Query
对象:
Then you need to create the root reference of your Firebase database and a Query
object like this:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("Users");
然后,您必须创建一个FirebaseRecyclerOptions
对象,如下所示:
Then you'll have to create a FirebaseRecyclerOptions
object like this:
FirebaseRecyclerOptions<BlogPost> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<BlogPost>()
.setQuery(query, BlogPost.class)
.build();
在您的活动类中,创建一个如下所示的holder
类:
In your activity class, create a holder
class that looks like this:
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);
}
}
然后创建一个声明为全局的适配器:
Then create an adapter which is declared as global:
private FirebaseRecyclerAdapter<BlogPost, BlogPostHolder> firebaseRecyclerAdapter;
并在您的活动中实例化它,如下所示:
And instantiate it in your activity like this:
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);
最后,不要忘记重写以下两种方法并开始侦听更改:
In the end, don't forget to override the following two methods and start listening for changes:
@Override
protected void onStart() {
super.onStart();
firebaseRecyclerAdapter.startListening();
}
@Override
protected void onStop() {
super.onStop();
if (firebaseRecyclerAdapter!= null) {
firebaseRecyclerAdapter.stopListening();
}
}
这篇关于如何从Firebase检索数据到适配器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!