我想要做的是循环firebase数据库中的所有用户帖子并在recycleler视图中显示它,现在每个帖子都有一个用户ID,为此我需要写第二个查询,它获取特定用户名用户的帖子。
这是json的外观
我现在所做的就是这个
list = new ArrayList < > ();
newsFeedRecyclerView = (RecyclerView)
findViewById(R.id.news_feed_recyclerview);
newsFeedRecyclerView.setHasFixedSize(true);
newsFeedRecyclerView.setLayoutManager(new
LinearLayoutManager(this));
newsFeedListAdapter = new NewsFeedListAdapter(list,
images);
newsFeedRecyclerView.setAdapter(newsFeedListAdapter);
Query query = databaseReference.child("Posts");
query.addListenerForSingleValueEvent(new
ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot data: dataSnapshot.getChildren()) {
final PostsPOJO postsPOJO = data.getValue(PostsPOJO.class);
images = postsPOJO.getcontent_post();
Query userDetails = databaseReference.child("Users/" + postsPOJO.getUserID());
userDetails.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String username = dataSnapshot.child("Username").getValue(String.class);
String profilePicturePath = dataSnapshot.child("ProfilePicture").getValue(String.class);
list.add(new PostsPOJO(postsPOJO.getUserID(), profilePicturePath, username, postsPOJO.getTimestamp(), postsPOJO.getPostText(), postsPOJO.getLocation(), postsPOJO.getcontent_post()));
newsFeedListAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
但问题在于它显示所有帖子首先其用户ID首先出现,因为第二篇帖子的用户不同。 例如(如果用户ID 1 = john和用户ID 2 = alex,它首先显示约翰的所有帖子,然后显示亚历克斯的帖子。
有人可以帮忙吗?
谢谢。答案 0 :(得分:1)
您的方法非常以“关系数据库”为导向。您不应该害怕对数据进行非规范化并将数次写入相同的数据。
换句话说,不要在Post节点下放置UserId,只需输入用户的用户名即可。然后,您只需要循环一次以列出具有用户名的帖子。
假设您想要显示手机号码和帖子的用户名。您也可以在Post节点下编写Mobile编号,就像您对Username所做的那样。再一次,在一个循环中,您将获得所需的一切。
答案 1 :(得分:0)
您正在设置单个值事件侦听器,因此当用户单击该帖子时,用于获取该特定用户的帖子的代码仅执行一次。
您可以使用this帖子来设置RecyclerView的onClick并编写以下代码,而不是这种方法:
newsFeedRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Log.w(TAG, "You clicked on "+position);
PostPojo postPojo = (PostPojo) list.get(position);
String userId = postPojo.getUserId();
// now is the time to fetch all posts of the above userId
}
}));