android 回收器视图从 Firebase 数据库检索数据

问题描述 投票:0回答:1

我尝试使用回收器视图从 firebase 数据库检索数据,但我不断收到此错误:

无法将 java.lang.String 类型的对象转换为 com.example.poppy.UserInformation 类型

有人可以帮我解决这个问题吗?

适配器类

public class postAdapter extends RecyclerView.Adapter<MyViewHolder> {

    Context context;
    ArrayList<UserInformation> posts;

    public postAdapter(Context context, ArrayList<UserInformation> posts) {
        this.context = context;
        this.posts = posts;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.card,parent,false));
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

        holder.text.setText(posts.get(position).getPost());

    }

    @Override
    public int getItemCount() {
        return posts.size();
    }
}

模特班

public class UserInformation {

    public String post_text;
    public String id;



    public UserInformation(String post_text,String id) {
        this.post_text = post_text;
        this.id=id;
    }

    //public UserInformation (){}

    //Getter
    public String getPost() {
        return post_text;
    }
    public String getId(){return id;}
}

NewsFeed 类

public class NewsFeedFragment extends Fragment {

    View root;
    RecyclerView recyclerView;
    postAdapter postAdapter;
    String firebaseAuth;
    DatabaseReference databaseReference;
    ArrayList<UserInformation> postsArray;

    public NewsFeedFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        root=inflater.inflate(R.layout.fragment_news_feed, container, false);

        init();

        return root;
    }

    private void init() {

        recyclerView=root.findViewById(R.id.recycler_newsfeed);

        RecyclerView.LayoutManager layoutManager=new GridLayoutManager(getContext(),1);
        recyclerView.setLayoutManager(layoutManager);
        postsArray=new ArrayList<UserInformation>();
        postAdapter=new postAdapter(getContext(),postsArray);
        recyclerView.setAdapter(postAdapter);

        firebaseAuth=FirebaseAuth.getInstance().getCurrentUser().getUid();
        databaseReference= FirebaseDatabase.getInstance().getReference().child("Posts").child(firebaseAuth);

        databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {

                if(snapshot.exists()){

                    for (DataSnapshot postsnapshot : snapshot.getChildren()){

                        UserInformation upload = postsnapshot.getValue(UserInformation.class);
                        

                        postsArray.add(upload);
                        recyclerView.invalidate();
                    }
                    postAdapter.notifyDataSetChanged();
                }

            }

            @Override
            public void onCancelled(DatabaseError error) {

            }
        });
    }
}

//Firebase Json

    {
  "Posts": {
    "SnUFcmk8Llcy7xwWJ5d1fpp47wx2": {
      "-Nc-G0KCloNLkDBzOauf": "I'm here in my backyard with my Lamborghini ♡",
      "-Nc-GBc67pArbwZj_bxV": "Hey I'm here coding and it's fun yall ☺"
    },
    "Ym0gl0vBzUV1omI7ncOeU9NdZWU2": {
      "-Nc5_A1W2dCn5rMGiZsP": "hey yellow"
    }
  },
  "Users": {
    "PMJvIPKaEbR0vlgmFlIhvmvCHC92": {
      "email": "[email protected]",
      "firstname": "Lisa",
      "lastname": "jim"
    },
    "SnUFcmk8Llcy7xwWJ5d1fpp47wx2": {
      "email": "[email protected]",
      "firstname": "Sky",
      "lastname": "star"
    },
    "Ym0gl0vBzUV1omI7ncOeU9NdZWU2": {
      "email": "[email protected]",
      "firstname": "Joan",
      "lastname": "Lee"
    }
  }
}

我尝试查看模型类是否有任何问题,但对我来说一切似乎都很好。

android firebase-realtime-database android-recyclerview
1个回答
0
投票

您的代码从数据库中的该路径读取数据:

databaseReference= FirebaseDatabase.getInstance().getReference().child("Posts").child(firebaseAuth);

虽然您没有共享数据,但鉴于路径为

/Posts/$uid
,该路径似乎包含一个用户的数据。但在
onDataChange
中,你会:

for (DataSnapshot postsnapshot : snapshot.getChildren()){
    UserInformation upload = postsnapshot.getValue(UserInformation.class);
    ...

因此,您循环遍历 /Posts/$uid

 下的子节点 
,并尝试从每个子节点中读取
UserInformation
对象。但是,如果
/Posts/$uid
处只有一个用户的信息,则意味着您尝试将该用户信息的每个属性解释为完整的
UserInformation
,这解释了错误消息。

解决方案是去掉循环,只读取一个用户的信息:

databaseReference= FirebaseDatabase.getInstance().getReference().child("Posts").child(firebaseAuth);

databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        if(snapshot.exists()){
            UserInformation upload = postsnapshot.getValue(UserInformation.class);            

            postsArray.add(upload);
            recyclerView.invalidate();
        }
        postAdapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(DatabaseError error) {
        throw error.toException(); // Never ignore errors
    }
});
© www.soinside.com 2019 - 2024. All rights reserved.