【问题标题】:Android Firebase Query not fetching updated dataAndroid Firebase 查询未获取更新的数据
【发布时间】:2017-07-11 10:33:10
【问题描述】:

我有一个从 Firebase 提取数据的自定义对象的 RecyclerView。在每个项目中,都有一个“likeButton”来增加对某个评论的喜欢。由于 RecyclerViews 没有 onItemClickListener 方法,所以我在适配器类的内部 ViewHolder 类中声明了这一点:

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        private TextView username, chirp, time, likeCount;
        private ImageButton likeButton;

        public ViewHolder(View itemView) {
            super(itemView);
            username = (TextView) itemView.findViewById(R.id.home_feed_item_username);
            chirp = (TextView) itemView.findViewById(R.id.home_feed_item_chirp);
            time = (TextView) itemView.findViewById(R.id.home_feed_item_time);
            likeCount = (TextView) itemView.findViewById(R.id.home_feed_item_like_count);
            likeButton = (ImageButton) itemView.findViewById(R.id.home_feed_item_like_button);

            //set click listener for likeButton
            likeButton.setOnClickListener(this);

            //set click listener for whole view, which will take them to the details activity
            itemView.setOnClickListener(this);
        }

        //define click listener for likeButton
        @Override
        public void onClick(View v) {
            if(v.getId() == likeButton.getId()){
                //access Firebase
                final DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("chirps");

                //query for this specific chirp
                Query query = reference.orderByChild("chirp").equalTo(chirp.getText().toString());
                query.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if(dataSnapshot.exists()){
                            //convert the dataSnapshot
                            HomeFeedItem queryResult = dataSnapshot.getValue(HomeFeedItem.class);
                            //here, it keeps printing out 0
                            System.out.println(queryResult.getLikeCount());

                            //increment it
                            int likeCountUpdated = queryResult.getLikeCount() + 1;

                            //update the likeCount textview
                            likeCount.setText(String.valueOf(likeCountUpdated));

                            //update the likeCount in the database
                            for (DataSnapshot child: dataSnapshot.getChildren()) {
                                reference.child(child.getKey()).child("likeCount").setValue(likeCountUpdated);
                            }
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

                Toast.makeText(v.getContext(), "Ahh, you liked "+username.getText().toString()+"'s chirp!", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(v.getContext(), "Going to chirp activity...", Toast.LENGTH_SHORT).show();
            }
        }
    }

所以这个想法是,每当用户单击likeButton 时,它都会增加类的likeCount 并更新Firebase。但是,这仅在我第一次单击 likeButton 时有效 - likeCount textView 和 Firebase 都增加了一个,但仅在第一次时,换句话说。在我的 SOUT 语句中,对于后续的点击,它一直说 likeCount 是 0,所以看起来它正在查询 HomeFeedItem 的第一个实例,而不是更新的 Firebase 对象。以及如何让它在我每次单击它时查询更新的 Firebase 对象,而不仅仅是获取原始对象?谢谢!

【问题讨论】:

  • 尝试使用 query.addChildEventListener 代替 query.addValueEventListener

标签: android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

当您对 Firebase 数据库执行查询时,可能会有多个结果。所以快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果列表。

因此,您的代码需要通过遍历快照的子级来处理该列表:

Query query = reference.orderByChild("chirp").equalTo(chirp.getText().toString());
query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
            //convert the dataSnapshot
            HomeFeedItem queryResult = childSnapshot.getValue(HomeFeedItem.class);
            //here, it keeps printing out 0
            System.out.println(queryResult.getLikeCount());

            //increment it
            int likeCountUpdated = queryResult.getLikeCount() + 1;

            //update the likeCount textview
            likeCount.setText(String.valueOf(likeCountUpdated));
        }
    }
    ...

【讨论】:

  • 原来我还必须遍历 childSnapshot.getChildren(),并使用 if(chirpField.getKey().equals("likeCount")){ 而不是将其转换为 HomeFeedItem。但是,感谢您指出正确的方向!顺便说一句,您是 Google 和 Udacity 周末视频中 Firebase 中的人吗?
  • 啊哈。我不太确定代码中发生了什么,但很确定你错过了最外层的循环。很高兴听到你把它整理好了。是的:我是那些视频中的烧烤人之一。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
相关资源
最近更新 更多