2017-06-26 39 views
0

所以每當我的適配器嘗試創建一個聊天項目它總是給人FirebaseRecyclerAdapter的popuplateViewHolder如何在沒有抓取空模型的情況下創建合適的模型類?

error: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference at com.swampass.nauticalapp.ChatConversationActivity$2.populateViewHolder(ChatConversationActivity.java:178)

這是在這部分的活動:

if(mSender.equals(HomeActivity.LoggedIn_User_Email)){...} 

我不知道,因爲我它爲什麼這樣做我不太瞭解它如何實際抓取類,但是當我點擊發送時,數據庫正在被消息更新。我嘗試了不同的東西,但我似乎無法找到如何解決它。

這是聊天發生:

公共類ChatConversationActivity擴展AppCompatActivity {

DatabaseReference myRef,myRef2,chatRef,userRef; 
    ImageView attach_icon,send_icon,no_data_available_image; 
    EditText message_area; 
    TextView no_chat; 
    public LinearLayoutManager mLinearLayoutManager; 
    static String Sender_Name; 
    public RecyclerView recyclerView; 
    //ChatItemAdapter adapter; 
    ArrayList<ChatMessage> msgs; 
    private FirebaseRecyclerAdapter<ChatMessage,ViewHolder> mUserMsg; 

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

     final String USER_ID = HomeActivity.LoggedIn_User_Email.replace("@","").replace(".",""); 
     String email= getIntent().getStringExtra("descripion").replace("@","").replace(".",""); 
     myRef = FirebaseDatabase.getInstance().getReference().child("Chat").child(USER_ID).child(email); 
     myRef.keepSynced(true); 
     //Log.d("LOGGED", "myRef : " + myRef); 



     myRef2 = FirebaseDatabase.getInstance().getReference().child("Chat").child(getIntent().getStringExtra("descripion").replace("@","").replace(".","")).child(USER_ID); 
     myRef2.keepSynced(true); 

     chatRef = FirebaseDatabase.getInstance().getReference().child("Chat"); 
     userRef = FirebaseDatabase.getInstance().getReference().child("Users"); 
     //Log.d("LOGGED", "myRef2 : " + myRef2); 


     ActionBar actionBar = getSupportActionBar(); 
     if (actionBar != null) { 
      actionBar.setDisplayHomeAsUpEnabled(true); 
      actionBar.setTitle(getIntent().getStringExtra("name") + "</font>"); 
     } 

     Sender_Name = getIntent().getStringExtra("name"); 

     attach_icon = (ImageView)findViewById(R.id.attachButton); 
     send_icon = (ImageView)findViewById(R.id.sendButton); 
     no_data_available_image = (ImageView)findViewById(R.id.no_data_available_image); 
     message_area = (EditText)findViewById(R.id.messageArea); 
     no_chat = (TextView)findViewById(R.id.no_chat_text); 

     msgs= new ArrayList<>(); 
     //adapter = new ChatItemAdapter(msgs,this,myRef2); 

     recyclerView = (RecyclerView)findViewById(R.id.chat_recycler_view); 
     mLinearLayoutManager = new LinearLayoutManager(ChatConversationActivity.this); 
     recyclerView.setLayoutManager(mLinearLayoutManager); 
     mLinearLayoutManager.setStackFromEnd(true); 


     ((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); 

     send_icon.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       String messageText = message_area.getText().toString().trim(); 

       if(!messageText.equals("")){ 

        //Date dick = DateFormat.getDateInstance().getCalendar().getTime(); 
        ChatMessage msg = new ChatMessage(messageText, USER_ID); 
        final DatabaseReference pushRef = chatRef.push(); 
        final String pushKey = pushRef.getKey(); 



        // ArrayMap<String, String> map = new ArrayMap<>(); 
        // map.put("message", messageText); 
       // map.put("sender", HomeActivity.LoggedIn_User_Email); 
        //myRef.push().setValue(map); 
        // myRef2.push().setValue(map); 

        HashMap<String, Object> messageItemMap = new HashMap<String, Object>(); 
        HashMap<String,Object> messageObj = (HashMap<String, Object>) new ObjectMapper().convertValue(msg, Map.class); 
        messageItemMap.put(pushKey, messageObj); 

        chatRef.push().setValue(messageItemMap); 

        msgs.add(msg); 

        message_area.setText(""); 


       } 

      } 

     }); 


     mUserMsg = new FirebaseRecyclerAdapter<ChatMessage, ViewHolder>(ChatMessage.class,R.layout.chat_item,ViewHolder.class,chatRef.getRef()) { 
      @Override 
      protected void populateViewHolder(ViewHolder view, ChatMessage message, int position) { 
       LinearLayout messageLine = view.layout; 
       TextView messgaeText = view.message; 
       TextView senderText = view.sender; 
       //TextView timeTextView = (TextView) view.findViewById(R.id.timeTextView); 
       final ImageView leftImage = view.leftPic; 
       final ImageView rightImage = view.rightPic; 
       LinearLayout individMessageLayout = view.messageLayout; 

       //set message and sender text 
       messgaeText.setText(message.getMessageText()); 
       senderText.setText(message.getUserID()); 
       //If you sent this message, right align 
       String mSender = message.getUserID(); 

       if(mSender.equals(HomeActivity.LoggedIn_User_Email)){ 
        //messgaeText.setGravity(Gravity.RIGHT); 
        //senderText.setGravity(Gravity.RIGHT); 
        messageLine.setGravity(Gravity.RIGHT); 
        leftImage.setVisibility(View.GONE); 
        rightImage.setVisibility(View.VISIBLE); 

        individMessageLayout.setBackgroundResource(R.drawable.incoming_msg); 
        //messgaeText.setBackgroundColor(ResourcesCompat.getColor(getResources(), 
        //  R.color.colorAccent, null)); 
       }else if(mSender.equals("System")){ 
        messageLine.setGravity(Gravity.CENTER_HORIZONTAL); 
        leftImage.setVisibility(View.GONE); 
        rightImage.setVisibility(View.GONE); 
       }else{ 
        //messgaeText.setGravity(Gravity.LEFT); 
        //senderText.setGravity(Gravity.LEFT); 
        messageLine.setGravity(Gravity.LEFT); 
        leftImage.setVisibility(View.VISIBLE); 
        rightImage.setVisibility(View.GONE); 
        individMessageLayout.setBackgroundResource(R.drawable.round_corners); 
        //messgaeText.setBackgroundColor(ResourcesCompat.getColor(getResources(), 
        //  R.color.colorPrimary, null)); 



       } 

      } 
     }; 
     recyclerView.setAdapter(mUserMsg); 
    } 




    public static class ViewHolder extends RecyclerView.ViewHolder { 
     private final TextView message, sender; 
     private final ImageView leftPic,rightPic; 
     private final LinearLayout.LayoutParams params, text_params; 
     LinearLayout layout,messageLayout; 


     public ViewHolder(final View itemView) { 
      super(itemView); 

      message = (TextView) itemView.findViewById(R.id.messageTextView); 
      sender = (TextView) itemView.findViewById(R.id.senderTextView); 
      //date = (TextView) itemView.findViewById(R.id.date_txt); 
      text_params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
      params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);; 
      layout = (LinearLayout) itemView.findViewById(R.id.messageLine); 
      leftPic = (ImageView) itemView.findViewById(R.id.leftMessagePic); 
      rightPic = (ImageView) itemView.findViewById(R.id.rightMessagePic); 
      messageLayout = (LinearLayout)itemView.findViewById(R.id.individMessageLayout); 
     } 

    } 

} 

這是我的聊天消息模型:

package com.swampass.nauticalapp.model; 

import java.util.Date; 

public class ChatMessage { 

    private String messageText; 
    private String userID; 
    // private Date date; 


    public ChatMessage() 
    { 

    } 

    //plain text message 
    public ChatMessage(String messageText, String userID) { 
     this.messageText = messageText; 
     this.userID = userID; 
    } 



    public String getUserID() {return userID;} 


    public void setMessageText(String messageText) {this.messageText = messageText;} 
    public String getMessageText() { return messageText;} 


} 

這裏是什麼樣子在數據庫中:enter image description here

回答

1

發生這種情況是因爲您正在使用String類on a null object referenceequals()方法。這意味着HomeActivity.LoggedIn_User_Email爲空。爲了解決這個問題,您需要確保您的登錄用戶is not null。首先嚐試用真實的電子郵件地址替換HomeActivity.LoggedIn_User_Email,以查看代碼是否正常工作,並調試代碼以獲取正確的登錄用戶。

還有一件事,您不需要替換@符號,只需要用.(點)符號就可以正確地獲得電子郵件地址。

希望它有幫助。

相關問題