【发布时间】: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