0

I had a listview for displaying a list of messages and i changed it to recyclerview for better readability and UI and its returning a nullpointerexception... can any1 help me out on why its reyurning null

Activity

 RecyclerView messageList;
List<Messages> messagesList = new ArrayList<>();
private LinearLayoutManager linearLayoutManager;
private MessageAdapter mAdapter;

mAdapter = new MessageAdapter(messagesList);
    messageList = (RecyclerView) findViewById(R.id.messageList);
    linearLayoutManager = new LinearLayoutManager(this);
    messageList.setHasFixedSize(true);
    messageList.setLayoutManager(linearLayoutManager);
    messageList.setAdapter(mAdapter);

 private void fetchMessages() {

   rootRef.child("Messages").child(MessageSenderId).child(MessageRecieverId).addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Messages message = dataSnapshot.getValue(Messages.class);
            messagesList.add(message);
            mAdapter.notifyDataSetChanged();
        }

        @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) {

        }
    });

Messages Class

public class Messages {
private String from;
private String message;
private String type;
private boolean seen;
private long time;

public Messages(){};

public String getFrom() {
    return from;
}

public void setFrom(String from) {
    this.from = from;
}

public String getMessage() {
    return message;
}

public void setMessage(String message) {
    this.message = message;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public boolean isSeen() {
    return seen;
}

public void setSeen(boolean seen) {
    this.seen = seen;
}

public long getTime() {
    return time;
}

public void setTime(long time) {
    this.time = time;
}

}

Adapter

public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MessageViewHolder>{
private List<Messages> userMessageList;
private FirebaseAuth mAuth;

public MessageAdapter (List<Messages>userMessageList)

{
    this.userMessageList = userMessageList;
}

public class MessageViewHolder extends RecyclerView.ViewHolder{
    public TextView messageText;
    public MessageViewHolder(View view)
    {
        super(view);
        messageText = (TextView)view.findViewById(R.id.message_text);
    }
}

@Override
public  int getItemCount()
{
    return userMessageList.size();
}
@Override
public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
    View V = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_chat_custom,parent,false);
    mAuth = FirebaseAuth.getInstance();
    return new MessageViewHolder(V);
}

@SuppressLint("ResourceType")
@Override
public void onBindViewHolder(MessageViewHolder holder, int position) {

        String current_user_id = mAuth.getInstance().getCurrentUser().getUid();
        Messages messages = userMessageList.get(position);
        String from_user = messages.getFrom();

//        Log.d("TAG",current_user_id + "/" + from_user);

        if (from_user.equals(current_user_id)){
            holder.messageText.setBackgroundResource(Color.BLUE);
            holder.messageText.setTextColor(Color.RED);
        }else {
            holder.messageText.setBackgroundResource(R.drawable.text_background1);
            holder.messageText.setTextColor(Color.CYAN);
        }

        holder.messageText.setText(messages.getMessage());
    }
}

Im getting an error in the line if (from_user.equals(current_user_id)){

The error

 FATAL EXCEPTION: main
                                             Process: com.appmaster.akash.messageplus, PID: 1135
                                             java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
                                                 at com.appmaster.akash.messageplus.MessageAdapter.onBindViewHolder(MessageAdapter.java:59)
                                                 at com.appmaster.akash.messageplus.MessageAdapter.onBindViewHolder(MessageAdapter.java:19)
                                                 at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6482)
                                                 at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6515)
                                                 at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5458)
                                                 at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5724)
                                                 at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5563)
                                                 at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5559)
                                                 at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2229)
                                                 at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1556)
                                                 at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1516)
                                                 at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:608)
                                                 at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3693)
                                                 at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3410)
                                                 at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3962)
                                                 at android.view.View.layout(View.java:16669)
                                                 at android.view.ViewGroup.layout(ViewGroup.java:5440)
                                                 at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080)
                                                 at android.view.View.layout(View.java:16669)
                                                 at android.view.ViewGroup.layout(ViewGroup.java:5440)
                                                 at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                 at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                 at android.view.View.layout(View.java:16669)
                                                 at android.view.ViewGroup.layout(ViewGroup.java:5440)
                                                 at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
                                                 at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
                                                 at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
                                                 at android.view.View.layout(View.java:16669)
                                                 at android.view.ViewGroup.layout(ViewGroup.java:5440)
                                                 at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                 at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                 at android.view.View.layout(View.java:16669)
                                                 at android.view.ViewGroup.layout(ViewGroup.java:5440)
                                                 at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
                                                 at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
                                                 at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
                                                 at android.view.View.layout(View.java:16669)
                                                 at android.view.ViewGroup.layout(ViewGroup.java:5440)
                                                 at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                 at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                 at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678)
                                                 at android.view.View.layout(View.java:16669)
                                                 at android.view.ViewGroup.layout(ViewGroup.java:5440)
                                                 at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2207)
                                                 at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1963)
                                                 at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1139)
                                                 at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6064)
                                                 at android.view.Choreographer$CallbackRecord.run(Choreographer.java:860)
                                                 at android.view.Choreographer.doCallbacks(Choreographer.java:672)
                                                 at android.view.Choreographer.doFrame(Choreographer.java:608)
                                                 at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:846)
                                                 at android.os.Handler.handleCallback(Handler.java:742)
                                                 at android.os.Handler.dispatchMessage(Handler.java:95)
                                                 at android.os.Looper.loop(Looper.java:157)
                                                at android.app.ActivityThread.main(ActivityThread.java:5

Someone please help me out.... sorry if its too much code but for finding out what the error is this much code is required... if you need more details please ask... and also it was working perfectly fine before when i was using listview so its not because of the logic or database

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807

2 Answers2

1
String from_user = messages.getFrom();

if (from_user.equals(current_user_id)){
   holder.messageText.setBackgroundResource(Color.BLUE);
   holder.messageText.setTextColor(Color.RED);
}

from_user is null

replace it with

if (from_user!=null && from_user.equals(current_user_id)){
     holder.messageText.setBackgroundResource(Color.BLUE);
     holder.messageText.setTextColor(Color.RED);
}
AskNilesh
  • 67,701
  • 16
  • 123
  • 163
Manohar
  • 22,116
  • 9
  • 108
  • 144
0

Firebase Calls are all Asynchronous,and there's no way to check if the call has been executed and you have received the data or not,so that might be the reason since the data has not arrived and you're trying to bind data to the views,try to use a Handler to make these Firebase Calls

Venky
  • 1,929
  • 3
  • 21
  • 36