2016-06-01 12 views
0

Firebaseが最後の更新を行った後にいくつか問題があります。現時点で私の最大の問題は、私がこのアップデートの前にやったアプリケーションのクラスを修正することができないということです。 以下のクラスは、私のリストビューで同じ名前を3回返しています.3人の登録ユーザーがいて、3人すべてが異なる名前を持っています。Firebaseが3回同じ値を返しています

注:アプリケーションが記録されているユーザーの名前の3倍を返します。

package com.example.stark.chattest; 

import android.content.Intent; 
import android.support.annotation.NonNull; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.ImageButton; 
import android.widget.ListAdapter; 
import android.widget.ListView; 

import com.example.stark.chattest.model.Message; 
import com.example.stark.chattest.model.User; 
import com.google.firebase.auth.FirebaseAuth; 
import com.google.firebase.auth.FirebaseUser; 
import com.google.firebase.database.ChildEventListener; 
import com.google.firebase.database.DataSnapshot; 
import com.google.firebase.database.DatabaseError; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.FirebaseDatabase; 

import java.util.ArrayList; 

public class ChatActivity extends AppCompatActivity { 

    private FirebaseAuth mAuth; 
    private FirebaseAuth.AuthStateListener mAuthListener; 
    private FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    private DatabaseReference myRef = database.getReference("users"); 
    private String TAG = "Resultado: "; 
    private ArrayList<String> userName = new ArrayList<String>(); 
    private ListView usersListView = (ListView) findViewById(R.id.chatListView); 
    private ListAdapter usersListViewAdapter = new ArrayAdapter<String>(ChatActivity.this, android.R.layout.simple_list_item_1, userName); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_chat); 

     mAuth = FirebaseAuth.getInstance(); 

     mAuthListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
       FirebaseUser user = firebaseAuth.getCurrentUser(); 
       if (user != null) { 
        // User is signed in 
       } else { 
        Intent intent = new Intent(ChatActivity.this, SignActivity.class); 
        startActivity(intent); 
        finish(); 
       } 
      } 
     }; 

     ImageButton sendImageButton = (ImageButton) findViewById(R.id.sendImageButton); 

     sendImageButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       EditText messageEditText = (EditText)findViewById(R.id.messageEditText); 
       FirebaseUser firebaseUser = mAuth.getCurrentUser(); 
       Message message = new Message(); 
       message.setMessage(String.valueOf(messageEditText.getText())); 
       message.setRead(true); 
       message.setTime(22221); 
       message.setSendersID(firebaseUser.getUid()); 
       message.setReceiversID("WTImZyGv5fcOJlGWI9fi0gdrfbd2"); 

       myRef.child(message.getSendersID()).child("message").child(message.getReceiversID()).child("4").setValue(message); 

       //Set the Reciever Message 
       message.setRead(false); 
       myRef.child(message.getReceiversID()).child("message").child(message.getSendersID()).child("4").setValue(message); 
      } 
     }); 

     ChildEventListener childEventListener = new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) { 
       User user = dataSnapshot.getValue(User.class); 
       userName.add(user.getName()); 
       usersListView.setAdapter(usersListViewAdapter); 

      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) { 

      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }; 
     myRef.addChildEventListener(childEventListener); 
    } 
} 

Here is my DB table.

注:英語は私の母国語ではありません:P

@Edit 私はonChildChanged内のすべてのものを削除し、onChildAddedですべてのコードを置きます。

答えて

1

あなたは、例えばこのライン

ListView usersListView = (ListView) findViewById(R.id.chatListView); 
ListAdapter usersListViewAdapter = new ArrayAdapter<String>(ChatActivity.this, android.R.layout.simple_list_item_1, userName); 

書き込みあなたのonCreate()方法でこの行のために、あなたは、一度だけ

と照会ユーザーについてを初期化する必要があり、あなたのコードで物事のカップルを変更する必要があります​​の代わりにonChildAdded()メソッドでこれを行う必要があります。結果を解析する必要はありません。forループが自動的に追加されます。

私が言ったことを説明するために少しのコード、

@Override 
public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) { 
    User user = dataSnapshot.getValue(User.class); 
    userName.add(user.getName()); 
    usersListViewAdapter.notifyDataSetChanged(); 
} 

あなたは、これが

+0

に役立ちますかどうかを確認し、​​からコードを削除することができますが、firebaseについての詳細を説明できますか? –

+0

@AnandSavjaniはいあなたは何を知っていますか? btw docsはhttps://firebase.google.com/docs/ –

+0

https://www.firebase.com/docs/android/quickstart.htmlで始まる最良の場所です。このURLはhttps:// firebaseとは異なります.google.com/docs /? –

関連する問題