0

我正在使用一種recyclerView,它可以膨脹兩種類型的視圖,能夠進行聊天,一切都很好,但不會立即發送或接收 當我發送消息時,除非點擊我的消息編輯文本, 哪項是錯誤的,因爲在聊天應該立即顯示...¿爲什麼recyclerView無法即時更新從Firebase獲取的數據?

我的適配器:

 public class ChatRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    public Context context; 
    public ArrayList<ChatPersonal> items = new ArrayList<>(); 
    private String mId; 
    private static final int CHAT_RIGHT = 1; 
    private static final int CHAT_LEFT = 2; 



    public ChatRecyclerAdapter (Context context, ArrayList<ChatPersonal> items, String mId){ 
     this.context = context; 
     this.items = items; 
     this.mId = mId; 
    } 



    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = null; 
     RecyclerView.ViewHolder holder = null; 
     switch (viewType){ 
      case CHAT_RIGHT: 
       view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_chat_right, parent, false); 
       holder = new ChatPersonalHolderSender(view); 
       break; 
      case CHAT_LEFT: 
       view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_chat_left, parent, false); 
       holder = new ChatPersonalHolder(view); 
       break; 
     } 

     return holder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     ChatPersonal mObject = items.get(position); 
     int itemViewType = getItemViewType(position); 
     switch(itemViewType){ 
      case CHAT_RIGHT: 
       ((ChatPersonalHolderSender) holder).mMENSAJE.setText(mObject.getMessage()); 
       ((ChatPersonalHolderSender) holder).mHORA.setText(DateUtils.getRelativeTimeSpanString(mObject.getHour())); 
       break; 
      case CHAT_LEFT: 
       ((ChatPersonalHolder) holder).mMENSAJE.setText(mObject.getMessage()); 
       ((ChatPersonalHolder) holder).mHORA.setText(DateUtils.getRelativeTimeSpanString(mObject.getHour())); 
       break; 

     } 
    } 



    @Override 
    public int getItemViewType(int position) { 
     if(items.get(position).getId().equals(mId)){ 
      return CHAT_RIGHT; 
     }else{ 
      return CHAT_LEFT; 
     } 
    } 




    @Override 
    public int getItemCount() { 
     return items.size(); 
    } 



} 

這是我chatClass的相關代碼:

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


    linearLayoutManager = new LinearLayoutManager(ActivityChat.this); 
      linearLayoutManager.setStackFromEnd(true); 
      mRecyclerView.setLayoutManager(linearLayoutManager); 
      mRecyclerView.setHasFixedSize(false); 
      adapter = new ChatRecyclerAdapter(getApplicationContext(), items, mId); 
      adapter.notifyDataSetChanged(); 
      mRecyclerView.setAdapter(adapter); 




      // send message 

     mSentMensaje.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        final String message = mEditText.getText().toString(); 
        if (!message.isEmpty()) { 
         mChat.setMessage(message); 
         mChat.setHour(System.currentTimeMillis()); 
         mChat.setId(mId); 

         if(mUser != null){ 
          if(mUser.getIDchat() != null){ 
           FirebaseUtils.getCHATT(mUser.getIDchat()).push().setValue(mChat).addOnSuccessListener(ActivityChat.this, new OnSuccessListener<Void>() { 
            @Override 
            public void onSuccess(Void aVoid) { 
             mRecyclerView.scrollToPosition(items.size() -1); 
             adapter.notifyDataSetChanged(); 
             mEditText.setText(""); 
            } 
           }); 
          }} 


    // retreive message 
     if(mUser != null){ 
     if(mUser.getIDchat() != null){ 
      FirebaseUtils.getCHATT(mUser.getIDchat()).limitToFirst(50).addChildEventListener(new ChildEventListener() { 
       @Override 
       public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
        if (dataSnapshot != null && dataSnapshot.getValue() != null) { 
         try{ 
          ChatPersonal model = dataSnapshot.getValue(ChatPersonal.class); 
          items.add(model); 
         } catch (Exception ex) { 
          Log.e(TAG, ex.getMessage()); 
         } 
        } 
       } 

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

       } 

       @Override 
       public void onChildRemoved(DataSnapshot dataSnapshot) { 

       } 

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

       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 
     } 




// status 

@Override 
protected void onStart() { 
    super.onStart(); 

    adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { 
     @Override 
     public void onChanged() { 
      super.onChanged(); 
      mRecyclerView.scrollToPosition(adapter.getItemCount() - 1); 
     } 
    }); 


} 

@Override 
protected void onResume() { 
    super.onResume(); 
    adapter.notifyDataSetChanged(); 

} 

@Override 
protected void onPostResume() { 
    super.onPostResume(); 
    adapter.notifyDataSetChanged(); 
} 



    } 
+1

只是一個猜測:當你用'items.add(模型)添加項目',通知變化的適配器: 'adapter.notifyDataSetChanged()'。如果你知道物品位置,最好使用'adapter.notifyItemInserted(pos)'。 –

+0

@BobSnyder謝謝 –

回答

相關問題