【问题标题】:Firebase adapter is not updating the data according to my needsFirebase 适配器未根据我的需要更新数据
【发布时间】:2022-02-03 14:40:59
【问题描述】:

我的应用程序有一些用户存储在 firebase 实时数据库中,每个用户都有一个节点“showGigCount”,如果有人点击该用户,该节点应该会更新。 问题: 如果用户 1 单击用户 2 的数据,则用户 1 的 showGigCount 将增加 1,用户 2 的 showGigCount 将减少 1。正如您在代码中看到的,我可以成功更新用户 1 的 showGigCount 的值但用户 2 的值没有改变。任何建议将不胜感激。下面是我的代码。谢谢大家

仪表板活动

    fAuth = FirebaseAuth.getInstance();
            firebaseDatabase = FirebaseDatabase.getInstance();
            dRef = FirebaseDatabase.getInstance().getReference("Users");
    
            if(fAuth.getCurrentUser() != null){
                UID = FirebaseAuth.getInstance().getCurrentUser().getUid();
            }
    
                dRef.child(UID).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        remainingClicks = Integer.parseInt(String.valueOf(snapshot.child("clicksRemain").getValue()));
                        showGigCount =  Integer.parseInt(String.valueOf(snapshot.child("showGigCount").getValue()));
                        String username =  String.valueOf(snapshot.child("name").getValue());
                        clicks.setText(String.valueOf(remainingClicks));
                        userName.setText(username);
                    }
                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {
    
                    }
                });
    
            recyclerView = findViewById(R.id.dashboardRCV);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
          LoadData();
        }
    
        private void LoadData() {
            // This will display the data of a user if his showGigCount is greater than 0.
            DatabaseReference db = FirebaseDatabase.getInstance().getReference();
            DatabaseReference usersRef = db.child("Users");
            Query queryByShowGigCount = usersRef.orderByChild("showGigCount").startAt(1);
            options = new FirebaseRecyclerOptions.Builder<ModelClass>()
                    .setQuery(queryByShowGigCount, ModelClass.class)
                    .build();
            adapter = new FirebaseRecyclerAdapter<ModelClass, MyViewHolder>(options) {
                @Override
                protected void onBindViewHolder(@NonNull MyViewHolder holder, int position, @NonNull ModelClass model) {
    
                    holder.previewLink.setURL(model.getGig(), new URLEmbeddedView.OnLoadURLListener() {
                        @Override
                        public void onLoadURLCompleted(URLEmbeddedData data) {
    
                            holder.previewLink.title(data.getTitle());
                            holder.previewLink.description(data.getDescription());
                            holder.previewLink.host(data.getHost());
                            holder.previewLink.thumbnail(data.getThumbnailURL());
                            holder.previewLink.favor(data.getFavorURL());
                        }
                    });
                    String user_clicked = getRef(position).getKey();
    
                    if (user_clicked.equals(UID)){
                        holder.previewLink.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                Log.d("if1 working", "it's showing the data");
                                Toast.makeText(DashboardActivity.this, "Opening your link is not allowed", Toast.LENGTH_LONG).show();
                            }
                        });
                    }else if (!user_clicked.equals(UID)){
                        holder.previewLink.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                            Log.d("Online User", "Online user clicking");
                                if (remainingClicks >= 1) { // This code increment the showGigCount of User 1 by 1.
                                    remainingClicks--;
                                    showGigCount ++;
                                    clicks.setText(String.valueOf(remainingClicks));
                                    UserClicksCounts();
                                    UserShowGigCounts();
                                    
                                    // I wrote this code so that showGigCount of User 2 will be decreased by 1 but it's not working
                                    dRef.child(String.valueOf(user_clicked)).addValueEventListener(new ValueEventListener() {
                                        @Override
                                        public void onDataChange(@NonNull DataSnapshot snapshot) {
    
                                            showGigCount--;
                                            UserGigCountDecrease();
                                            Log.d("CLicked User", "showGigCount decreased");
                                        }
    
                                        @Override
                                        public void onCancelled(@NonNull DatabaseError error) {
    
                                        }
                                    });
                                } else if (remainingClicks == 0){
                                    zeroClicks.setVisibility(View.VISIBLE);
                                }
                            }
                        });
                    }
                    }
    
                @NonNull
                @Override
                public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_layout, parent, false);
                    return new MyViewHolder(view);
                }
            };
            adapter.startListening();
            recyclerView.setAdapter(adapter);
        }
        void UserClicksCounts(){
            FirebaseDatabase database = FirebaseDatabase.getInstance();
            DatabaseReference myRef = database.getReference("Users").child(UID);
            myRef.child("clicksRemain").setValue(remainingClicks);
        }
    // This will count how many times the gig will be shown to the user
        void UserShowGigCounts(){
            FirebaseDatabase database = FirebaseDatabase.getInstance();
            DatabaseReference myRef = database.getReference("Users").child(UID);
            myRef.child("showGigCount").setValue(showGigCount);

void UserGigCountDecrease(){
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef = database.getReference("Users").child(user_clicked);
        myRef.child("showGigCount").setValue(showGigCount);
    }

MyViewHolder 类

public MyViewHolder(@NonNull @NotNull View itemView) {
        super(itemView);

        previewLink =  itemView.findViewById(R.id.uev);
        geglink = (TextView) itemView.findViewById(R.id.rcvGigLink);
        userName = (TextView) itemView.findViewById(R.id.rcvName);
        userAbout = (TextView) itemView.findViewById(R.id.rcvAbout);
        v = itemView;
    }

【问题讨论】:

  • 您确定 user_clicked 在侦听器中不为空吗?也许让它全球化
  • @Avital 是的,我已经检查过了,监听器内部不是空的
  • 您调用 UserShowGigCounts 来更新用户 2,但在此方法中您使用 UID 来获取用户进行更新,从而为您提供用户 1...您应该使用特定用户调用此方法每次更新
  • @Avital 哦,感谢您指向它。让我试试这个。
  • 调试代码 insdie 'UserGigCountDecrease' 并确保 'user_clicked' 是用户 2 的字符串。顺便说一句,我认为您不需要每次都需要一个新的 FirebaseDatabase 数据库...在以下位置创建一个全局数据库开始并在任何地方使用它

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


【解决方案1】:

为了解决这个问题,我在 OnCLickListener 中添加了这些行

> user_clicked = getRef(position).getKey();
>                                 assert user_clicked != null;
>                                 dRef.child(user_clicked).child("showGigCount").setValue(model.getShowGigCount()-1);

它现在成功地减少了用户 2 的 showGigCount。 我还删除了以下代码行

dRef.child(String.valueOf(user_clicked)).addValueEventListener(new 值事件监听器(){ @覆盖 public void onDataChange(@NonNull DataSnapshot 快照) {

                                    showGigCount--;
                                    UserGigCountDecrease();
                                    Log.d("CLicked User", "showGigCount decreased");
                                }

                                @Override
                                public void onCancelled(@NonNull DatabaseError error) {

                                }
                            });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2014-09-18
    • 2018-06-28
    • 2017-08-04
    • 2017-03-06
    • 1970-01-01
    相关资源
    最近更新 更多