2017-11-04 6 views
0

나는 애플 리케이션을 가지고있는 사람을 모두 업데이트 할 Task app를 만들려고 노력하고있다. 나는 각 버튼이 다른 작업이라는 버튼을 갖고 싶다. 지금은 2이다. 누군가가 작업을 누를 때마다 나는 원하는 것이다. 작업에는 클릭 한 특정 사용자에게주는 "포인트"가 있으며, 버튼은 모두에게 완료로 업데이트되며 버튼의 이름은 ButtonName + UserClicked + TimeClicked로 변경됩니다. 내가 여기서 문제가 JSON 파일에서 포인트 값을 얻는을 갖는 점과 사용자를 업데이트하고 것은 내 JSON 파일입니다 : 여기 Android-Firebase-getValue?

{ 
    "Tasks":{ 
     "Room1":{ 
      "DoTime":"", 
      "ID":2, 
      "MadeBy":"", 
      "Points":150, 
      "isActive":1 
     }, 
     "Room2":{ 
      "DoTime":"", 
      "ID":1, 
      "MadeBy":"", 
      "Points":100, 
      "isActive":1 
     } 
    }, 
    "Users":{ 
     "L18uheV3GVbmJ8GmVvoCOmU3e1E2":{ 
      "Email":"[email protected]", 
      "Points":0, 
      "UserName":"Name1", 
      "isAdmin":0 
     }, 
     "tcAOO7dmXEgADBqRwTTlUfWIH803":{ 
      "Email":"[email protected]", 
      "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 : 단추는이 기능을 호출합니다.

답변

1

코드를 이해하는 동안 잠시 동안 더 설명해야합니다. 어쨌든 코드의 문제는 버튼을 클릭 할 때 리스너를 연결한다는 것이므로 다음 버튼을 클릭하면 모든 것이 작동합니다.

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 메서드에서 추가 제안 :

당신이 button_function 외부에 이러한 추가해야이 문제를 해결합니다.