2017-02-20 30 views
0

У меня есть чат, который имеет поддержку базы данных Firebase для сообщения чата. Я могу отправить сообщение на экран, а также в базу данных, но проблема возникает, когда я покидаю чат и вернусь на экран чата.База данных FIrebase addListenerForSingleValueEvent listner никогда не вызывал

Экран чата становится пустым, и я хочу загрузить весь предыдущий чат из базы данных Firebase. Поэтому я создал еще одну ссылку Firebase с узлом чата, но не смог получить чат для пользователей, потому что onDataChange в onCreate никогда не вызывается.

Вот мой чат экран класса

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

Какова структура вашего чата и где вы создаете комнату (Узлы)? – androidXP

ответ

0

Это может быть причиной каждый раз, когда вы входите в дочерний объект, который вы вызываете firebase.updateChildren, он удалит все предыдущие данные и создаст свежий узел, ваш код будет в порядке, он будет извлекать все данные. Просто убедитесь, что вы не создаете новую комнату при каждом входе в комнату.

+0

Да, я переписывал базу данных. большое спасибо – Ritu

0

Получить всю структуру с

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

затем получить ребенок вы хотите с mDatabase.child("yourChildId"). Это возвращает вам ссылку. Установите для этой ссылки .addListenerForSingleValueEvent. Вы попробовали что-то вроде этого?

 Смежные вопросы

  • Нет связанных вопросов^_^