2017-11-04 10 views
0

私は、アプリを持っているすべての人をアップデートするタスクアプリを構築しようとしています。 いくつかのボタンを持っています。それぞれのボタンは別のタスクです。今のところは2つです。 誰かがタスクを押すたびにタスクはそれをクリックした特定のユーザーに与える「ポイント」を持っており、ボタンはDONEとして全員に更新され、ボタンの名前は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

コードを理解するためにしばらく時間がかかりましたが、もっと説明しておく必要があります。とにかく、コードの問題は、ボタンがクリックされたときにリスナーをアタッチすることです。これが次のボタンをクリックするとすべてが機能します。あなたは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メソッドでそれらを追加提案します。