I am working on a chat app using Android Studio and firebase, so to differentiate between message sender and receiver I have tried the following codes :
MessageAdapter:
<code>
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.firebase.auth.FirebaseAuth;
import java.util.ArrayList;
import java.util.List;
import ma.enset.chatburst.ChatActivity;
import ma.enset.chatburst.R;
import ma.enset.chatburst.models.MessageModel;
public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MessageViewHolder>{
private static final int VIEW_TYPE_SENT = 1;
private static final int VIEW_TYPE_RECEIVED = 2;
private Context context;
private List<MessageModel> messages;
public MessageAdapter(Context context) {
this.context = context;
this.messages = new ArrayList<>();
}
public void add(MessageModel message){
messages.add(message);
notifyDataSetChanged();
}
public void clear(){
messages.clear();
notifyDataSetChanged();
}
@NonNull
@Override
public MessageAdapter.MessageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// LayoutInflater inflater = LayoutInflater.from(parent.getContext());
if (viewType == VIEW_TYPE_SENT){
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_row_sent, parent, false);
return new MessageAdapter.MessageViewHolder(view);
}
else {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_row_received, parent, false);
return new MessageAdapter.MessageViewHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull MessageAdapter.MessageViewHolder holder, int position) {
MessageModel message = messages.get(position);
Log.i("info", "sender ID: " + message.getSenderId());
Log.i("info", "sender ID from Firebase: " + FirebaseAuth.getInstance().getUid());
Log.i("info", "message: " + message.getMessage());
Log.i("info", "Sent holder: " + holder.textViewSentMessage);
Log.i("info", "Received holder: " + holder.textViewReceivedMessage);
if (message.getSenderId().equals(FirebaseAuth.getInstance().getUid())){
holder.textViewSentMessage.setText(message.getMessage());
} else {
holder.textViewReceivedMessage.setText(message.getMessage());
}
}
@Override
public int getItemCount() {
return messages.size();
}
public List<MessageModel> getMessages() {
return messages;
}
@Override
public int getItemViewType(int position) {
if (messages.get(position).getMessageId().equals(FirebaseAuth.getInstance().getUid())){
return VIEW_TYPE_SENT;
} else {
return VIEW_TYPE_RECEIVED;
}
}
public static class MessageViewHolder extends RecyclerView.ViewHolder {
TextView textViewSentMessage, textViewReceivedMessage;
public MessageViewHolder(@NonNull View itemView) {
super(itemView);
textViewSentMessage = itemView.findViewById(R.id.sentMessage);
textViewReceivedMessage = itemView.findViewById(R.id.receivedMessage);
}
}
}
</code>
<code>
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.firebase.auth.FirebaseAuth;
import java.util.ArrayList;
import java.util.List;
import ma.enset.chatburst.ChatActivity;
import ma.enset.chatburst.R;
import ma.enset.chatburst.models.MessageModel;
public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MessageViewHolder>{
private static final int VIEW_TYPE_SENT = 1;
private static final int VIEW_TYPE_RECEIVED = 2;
private Context context;
private List<MessageModel> messages;
public MessageAdapter(Context context) {
this.context = context;
this.messages = new ArrayList<>();
}
public void add(MessageModel message){
messages.add(message);
notifyDataSetChanged();
}
public void clear(){
messages.clear();
notifyDataSetChanged();
}
@NonNull
@Override
public MessageAdapter.MessageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// LayoutInflater inflater = LayoutInflater.from(parent.getContext());
if (viewType == VIEW_TYPE_SENT){
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_row_sent, parent, false);
return new MessageAdapter.MessageViewHolder(view);
}
else {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_row_received, parent, false);
return new MessageAdapter.MessageViewHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull MessageAdapter.MessageViewHolder holder, int position) {
MessageModel message = messages.get(position);
Log.i("info", "sender ID: " + message.getSenderId());
Log.i("info", "sender ID from Firebase: " + FirebaseAuth.getInstance().getUid());
Log.i("info", "message: " + message.getMessage());
Log.i("info", "Sent holder: " + holder.textViewSentMessage);
Log.i("info", "Received holder: " + holder.textViewReceivedMessage);
if (message.getSenderId().equals(FirebaseAuth.getInstance().getUid())){
holder.textViewSentMessage.setText(message.getMessage());
} else {
holder.textViewReceivedMessage.setText(message.getMessage());
}
}
@Override
public int getItemCount() {
return messages.size();
}
public List<MessageModel> getMessages() {
return messages;
}
@Override
public int getItemViewType(int position) {
if (messages.get(position).getMessageId().equals(FirebaseAuth.getInstance().getUid())){
return VIEW_TYPE_SENT;
} else {
return VIEW_TYPE_RECEIVED;
}
}
public static class MessageViewHolder extends RecyclerView.ViewHolder {
TextView textViewSentMessage, textViewReceivedMessage;
public MessageViewHolder(@NonNull View itemView) {
super(itemView);
textViewSentMessage = itemView.findViewById(R.id.sentMessage);
textViewReceivedMessage = itemView.findViewById(R.id.receivedMessage);
}
}
}
</code>
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.firebase.auth.FirebaseAuth;
import java.util.ArrayList;
import java.util.List;
import ma.enset.chatburst.ChatActivity;
import ma.enset.chatburst.R;
import ma.enset.chatburst.models.MessageModel;
public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MessageViewHolder>{
private static final int VIEW_TYPE_SENT = 1;
private static final int VIEW_TYPE_RECEIVED = 2;
private Context context;
private List<MessageModel> messages;
public MessageAdapter(Context context) {
this.context = context;
this.messages = new ArrayList<>();
}
public void add(MessageModel message){
messages.add(message);
notifyDataSetChanged();
}
public void clear(){
messages.clear();
notifyDataSetChanged();
}
@NonNull
@Override
public MessageAdapter.MessageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// LayoutInflater inflater = LayoutInflater.from(parent.getContext());
if (viewType == VIEW_TYPE_SENT){
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_row_sent, parent, false);
return new MessageAdapter.MessageViewHolder(view);
}
else {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_row_received, parent, false);
return new MessageAdapter.MessageViewHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull MessageAdapter.MessageViewHolder holder, int position) {
MessageModel message = messages.get(position);
Log.i("info", "sender ID: " + message.getSenderId());
Log.i("info", "sender ID from Firebase: " + FirebaseAuth.getInstance().getUid());
Log.i("info", "message: " + message.getMessage());
Log.i("info", "Sent holder: " + holder.textViewSentMessage);
Log.i("info", "Received holder: " + holder.textViewReceivedMessage);
if (message.getSenderId().equals(FirebaseAuth.getInstance().getUid())){
holder.textViewSentMessage.setText(message.getMessage());
} else {
holder.textViewReceivedMessage.setText(message.getMessage());
}
}
@Override
public int getItemCount() {
return messages.size();
}
public List<MessageModel> getMessages() {
return messages;
}
@Override
public int getItemViewType(int position) {
if (messages.get(position).getMessageId().equals(FirebaseAuth.getInstance().getUid())){
return VIEW_TYPE_SENT;
} else {
return VIEW_TYPE_RECEIVED;
}
}
public static class MessageViewHolder extends RecyclerView.ViewHolder {
TextView textViewSentMessage, textViewReceivedMessage;
public MessageViewHolder(@NonNull View itemView) {
super(itemView);
textViewSentMessage = itemView.findViewById(R.id.sentMessage);
textViewReceivedMessage = itemView.findViewById(R.id.receivedMessage);
}
}
}
message_row_sent.xml:
<code><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:layout_margin="10dp"
>
<TextView
android:id="@+id/sentMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/rounded_corner_sent"
android:textColor="@color/black"
android:padding="10dp"
android:textSize="16dp"
/>
</RelativeLayout>
</LinearLayout>
</code>
<code><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:layout_margin="10dp"
>
<TextView
android:id="@+id/sentMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/rounded_corner_sent"
android:textColor="@color/black"
android:padding="10dp"
android:textSize="16dp"
/>
</RelativeLayout>
</LinearLayout>
</code>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:layout_margin="10dp"
>
<TextView
android:id="@+id/sentMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/rounded_corner_sent"
android:textColor="@color/black"
android:padding="10dp"
android:textSize="16dp"
/>
</RelativeLayout>
</LinearLayout>
The problem here is that every time I want to send a message it gives me this error:
<code>java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
</code>
<code>java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
</code>
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
I have check the id of TextView.