2017-02-20 4 views
0

Ich habe einen Chat Geröll mit Firebase-Datenbank-Unterstützung für Chat-Nachricht. Ich kann Nachrichten auf dem Bildschirm und auch in der Datenbank veröffentlichen, aber das Problem tritt auf, wenn ich den Chat verlasse und zum Chatbildschirm zurückkehre.FIrebase Datenbank addListenerForSingleValueEvent Listener nie

Der Chat-Bildschirm wird leer und ich möchte alle vorherigen Chat aus der Firebase-Datenbank laden. Also habe ich eine weitere Firebase-Referenz mit Chat-Knoten erstellt, konnte aber keine Benutzer chatten, da onDataChange in onCreate nie aufgerufen wird.

Hier ist meine Chat-Bildschirm Klasse

public class Chat_Screen extends AppCompatActivity implements View.OnClickListener,ChildEventListener{ 

    public static final String TAG = "###CHAT SCREEN###"; 
    private EditText TypedMsg; 
    private ImageButton SendButton,Emo_Button; 
    String UserName_Intent,UserImage_Intent,UserID_Intent,Room_Name_Intent; 
    String Chat_Msg,Chat_UserName; 

    RecyclerView.Adapter adapter; 
    RecyclerView recyclerView; 
    RecyclerView.LayoutManager layoutManager; 

    Iterator iterator; 
    Toolbar toolbar; 
    private ProgressDialog progressDialog; 

    List<Chat_Wrapper> message=new ArrayList<>();; 

    DatabaseReference databaseReference; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.chat_screen_main); 
     TypedMsg= (EditText) findViewById(R.id.Chat_Screen_Text_Message); 
     SendButton= (ImageButton) findViewById(R.id.Chat_Screen_Send); 
     Emo_Button= (ImageButton) findViewById(R.id.Chat_Screen_Smiley); 
     toolbar= (Toolbar) findViewById(R.id.Chat_Screen_Toolbar); 
     progressDialog=new ProgressDialog(this); 
     progressDialog.setMessage("This Is Chat Room"); 
     progressDialog.show(); 

     // GET INTENT VALUES FROM USER PROFILE CLASS 

     UserName_Intent=getIntent().getExtras().getString("Get_Name"); 
     UserImage_Intent=getIntent().getExtras().getString("Get_Image"); 
     UserID_Intent=getIntent().getExtras().getString("Get_Phone"); 
     Room_Name_Intent=getIntent().getExtras().getString("room_user"); 

     // RECYCLER VIEW 
     recyclerView= (RecyclerView) findViewById(R.id.Chat_Screen_Message_List); 
     recyclerView.setHasFixedSize(true); 
     layoutManager=new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(layoutManager); 


     //FIREBASE FETCH ALL PREVIOUS CHAT OF USERS/CHATROOM ------THIS NEVER CALLS 
     DatabaseReference db=FirebaseDatabase.getInstance().getReference(Room_Name_Intent); 
     Log.d(TAG,"Database Reference of child "+db); 
     db.addListenerForSingleValueEvent(new ValueEventListener() { 

      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot snapshot : dataSnapshot.getChildren()){ 
        Log.d(TAG,"Value of SnapShop is calling"); 
        Log.d(TAG,"Value of SnapShop is calling "+snapshot.getValue()); 
        Log.d(TAG,"Value of SnapShop is calling 2nd "+snapshot.getValue()); 

       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 



     Log.d(TAG,"Value of List "+message+" Value of Adapter "+adapter); 
     adapter=new Chat_Adapter(this,message); 
     recyclerView.setAdapter(adapter); 



     //INITIALIZING MESSAGE ARRAYLIST 


     SendButton.setOnClickListener(this); 

     databaseReference= FirebaseDatabase.getInstance().getReference().getRoot().child(Room_Name_Intent); 
     databaseReference.addChildEventListener(this); 


    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater menuInflater = getMenuInflater(); 
     menuInflater.inflate(R.menu.chat_screen_menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     //HANDLE ITEM SELECTION 
     switch (item.getItemId()) { 
      case R.id.sendFile: 
       Log.d(TAG, "Send File Menu Clicked"); 
       return true; 
      case R.id.geo: 
       Log.d(TAG, "Geo Fencing Button Clicked"); 
       return true; 
      case R.id.Call: 
       Log.d(TAG, "Call Button Clicked"); 
       Toast.makeText(this, "Call Button Clicked", Toast.LENGTH_LONG).show(); 
       return true; 

      default: 
       return super.onOptionsItemSelected(item); 
     } 

    } 

    @Override 
    public void onClick(View v) { 
     int itemClick=v.getId(); 

     switch (itemClick){ 
      case R.id.Chat_Screen_Send: 
       Log.d(TAG,"Send Button Pressed"); 

       Log.d(TAG,"FireBase Chat Room Level "+databaseReference); 
       //GET MESSAGE FROM EDIT TEXT INTO HASHMAP TO UPDATE DATABASE 
       Map<String,Object> map=new HashMap<>(); 
       map.put("Name",UserName_Intent); 
       map.put("Message",TypedMsg.getText().toString()); 

       String Temp_Key=databaseReference.push().getKey(); 
       Map<String,Object> RoomKey=new HashMap<>(); 
       databaseReference.updateChildren(RoomKey); 
       DatabaseReference message_Root=databaseReference.child(Temp_Key); 
       message_Root.updateChildren(map); 
       Log.d(TAG,"Msg Root "+message_Root); 

       TypedMsg.setText(""); 
       break; 

     } 

    } 


    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     append_chat_conversation(dataSnapshot); 
    } 

    @Override 
    public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
     append_chat_conversation(dataSnapshot); 
    } 

    @Override 
    public void onChildRemoved(DataSnapshot dataSnapshot) { 

    } 

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

    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
    private void append_chat_conversation(DataSnapshot dataSnapshot){ 
     iterator=dataSnapshot.getChildren().iterator(); 
     while (iterator.hasNext()){ 

      Chat_Msg=(String) ((DataSnapshot)iterator.next()).getValue(); 
      Chat_UserName= (String) ((DataSnapshot)iterator.next()).getValue(); 

      Calendar calendar=Calendar.getInstance(Locale.getDefault()); 
      int hour=calendar.get(Calendar.HOUR_OF_DAY); 
      int min=calendar.get(Calendar.MINUTE); 
      int second=calendar.get(Calendar.SECOND); 
      Log.d(TAG,"Time of the Day "+hour+" -- "+min+" -- "+second); 
      String time=(hour+" -- "+min+" -- "+second); 





      Log.d(TAG,Chat_Msg+" TIME "+time+" PHONE "+UserID_Intent+" User Image "+UserImage_Intent+" User Name "+UserName_Intent); 

      Chat_Wrapper chat_wrapper=new Chat_Wrapper(Chat_Msg,time,UserID_Intent,UserImage_Intent); 
      message.add(chat_wrapper); 

      adapter.notifyItemInserted(adapter.getItemCount()+1); 


      Log.d(TAG,"Chat Msg & User Name "+Chat_Msg+" "+Chat_UserName+" Message List "+message.size()); 

     } 
    } 
} 
+0

Was ist die Struktur Ihres Chats und wo erstellen Sie das Zimmer (Knoten)? – androidXP

Antwort

0

Dies könnte Ursache jedes Mal, wenn Sie in Kind eingeben Sie firebase.updateChildren aufrufen wird es alle vorherigen Daten löschen und erstellen Sie neue Knoten Ihren Code ist in Ordnung wird es alle Daten abrufen. Stellen Sie sicher, dass Sie nicht jedes Mal, wenn Sie das Zimmer betreten, neues Zimmer erstellen.

+0

Ja, ich überschrieb die Datenbank. vielen Dank – Ritu

0

Holen Sie sich die ganze Struktur mit

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); 

dann das Kind bekommen Sie mit mDatabase.child("yourChildId") wollen. Dies gibt einen Verweis auf Sie zurück. Setzen Sie eine .addListenerForSingleValueEvent auf diese Referenz. Hast du so etwas versucht?

Verwandte Themen