我正在尝试构建一个可以更新拥有该应用的所有人的任务应用, 我想要一些按钮,每个按钮是另一个任务,现在我有2个, 我希望每当有人按下任务时,任务都有"点"为了给点击它的某个用户,按钮将更新为每个人DONE,按钮的名称将更改为ButtonName + UserClicked + TimeClicked。 我无法从JSON文件获取点值并使用点更新用户,这是我的JSON文件:
{
"Tasks":{
"Room1":{
"DoTime":"",
"ID":2,
"MadeBy":"",
"Points":150,
"isActive":1
},
"Room2":{
"DoTime":"",
"ID":1,
"MadeBy":"",
"Points":100,
"isActive":1
}
},
"Users":{
"L18uheV3GVbmJ8GmVvoCOmU3e1E2":{
"Email":"a@a.com",
"Points":0,
"UserName":"Name1",
"isAdmin":0
},
"tcAOO7dmXEgADBqRwTTlUfWIH803":{
"Email":"b@a.com",
"Points":0,
"UserName":"Name2",
"isAdmin":0
}
},
"update":2
}
这是我的代码:
String displayName = " ";
Object TaskingPoints = 0;
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference RefUser = database.getReference("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
DatabaseReference RefTask = database.getReference("Tasks");
public void button_function(View Button){
final String ButtonTaskName = Button.getResources().getResourceEntryName(Button.getId());
final Button b = (Button) Button;
DatabaseReference givePoints = database.getReference(ButtonTaskName).child("Points");
DatabaseReference ClickUser = (DatabaseReference) RefUser.child("UserName");
final CharSequence ClickTime = DateFormat.format("dd-MM-yyy (HH:mm)" , new Date().getTime());
RefUser.child("UserName").addValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
displayName = dataSnapshot.getValue().toString();
b.setText(b.getText() + " (" + displayName + ") " + ClickTime);
RefTask.child(ButtonTaskName).child("DoTime").setValue(ClickTime);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
RefTask.child(ButtonTaskName).child("Points").addValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
TaskingPoints = dataSnapshot.getValue();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
RefTask.child(ButtonTaskName).child("isActive").setValue(0);
RefUser.child("Points").setValue(TaskingPoints);
RefTask.child(ButtonTaskName).child("MadeBy").setValue(displayName);
b.getBackground();
b.setEnabled(false);
b.setBackgroundResource(R.color.myGreen);
}
很多工作,但问题是: 每当我运行应用程序和我点击的第一个按钮时,用户的点数不会更新,任务中的MadeBy键也不会更新,但是当我点击另一个按钮时,所有内容都会更新,但是通过我点击的第一个按钮, 请教我,我做错了什么。 P.S:点击时按钮调用此功能。
答案 0 :(得分:1)
花了一段时间来理解你的代码,你应该更多地解释它。无论如何,你的代码中的问题是你在单击按钮时附加了监听器,这就是为什么在下一个按钮上点击一切正常。
要解决此问题,您应该在button_function外添加这些:
RefUser.child("UserName").addValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
displayName = dataSnapshot.getValue().toString();
b.setText(b.getText() + " (" + displayName + ") " + ClickTime);
RefTask.child(ButtonTaskName).child("DoTime").setValue(ClickTime);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
RefTask.child(ButtonTaskName).child("Points").addValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
TaskingPoints = dataSnapshot.getValue();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
我建议你在onCreate方法中添加它们。