Chat Application mit Firebase und Recyclerview

F

Fabicoe

Neues Mitglied
Threadstarter
Hallo liebe Community,

ich bin gerade dabei eine Chat Application mit Firebase und einem Recyclerview zu erstellen.

Ich habe nur ein Problem. Bei meinem Code wird die Nachricht des Absenders auf der rechten Seite angezeigt. Die Nachricht des Empfängers soll auf der linken Seite stehen. Nur sie wird nicht angezeigt. Ich finde den Fehler nicht. Es wird weder eine Errormeldung erstellt, noch ein Fehler im Logcat angezeigt.

Mein Recyclerview ist folgender:

Code:
package com.example.myapplicationsonet;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


public class Message_recyclerview extends AppCompatActivity {

    TextView tvUsername;
    ImageButton ibtnSend;
    EditText etMessage;

    FirebaseUser fuser;
    DatabaseReference databaseReference;

    MessageAdapter messageAdapter;
    List<message_helperclass> mChat;

    RecyclerView recyclerView;

    Intent intent;

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

        recyclerView = (RecyclerView) findViewById(R.id.rvmessage);
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
        linearLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(linearLayoutManager);

        tvUsername = (TextView) findViewById(R.id.textView_message_username);
        etMessage = (EditText) findViewById(R.id.messagebox);
        ibtnSend = (ImageButton) findViewById(R.id.button_send);

        intent = getIntent();
        final String username = intent.getStringExtra("username");
        fuser = FirebaseAuth.getInstance().getCurrentUser();

        fuser = FirebaseAuth.getInstance().getCurrentUser();
        databaseReference = FirebaseDatabase.getInstance().getReference("User").child(username);

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                tvUsername.setText(username);

                readMessages(fuser.getUid(), username);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

        ibtnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String msg = etMessage.getText().toString();
                if (!msg.equals("")){
                    sendMessage(fuser.getUid(), username, msg);
                }else {
                    Toast.makeText(Message_recyclerview.this, "Du kannst keine leeren Nachrichten versenden", Toast.LENGTH_LONG).show();
                }


                etMessage.setText("");
            }
        });

    }

    private void sendMessage(String sender, String receiver, String message ){

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

        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("sender", sender);
        hashMap.put("receiver", receiver);
        hashMap.put("message", message);

        databaseReference.child("Chats").push().setValue(hashMap);
    }

    private void readMessages(final String myid, final String username){
        mChat = new ArrayList<>();

        databaseReference = FirebaseDatabase.getInstance().getReference("Chats");
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mChat.clear();
                for (DataSnapshot snapshot : dataSnapshot.getChildren()){
                    message_helperclass chat = snapshot.getValue(message_helperclass.class);
                    if (chat.getReceiver().equals(myid) && chat.getSender().equals(username) ||
                    chat.getReceiver().equals(username) && chat.getSender().equals(myid)){
                        mChat.add(chat);
                    }

                    messageAdapter = new MessageAdapter(Message_recyclerview.this, mChat);
                    recyclerView.setAdapter(messageAdapter);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
}
Mein Adapter sieht so aus:

Code:
package com.example.myapplicationsonet;

import android.content.Context;
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 com.google.firebase.auth.FirebaseUser;

import java.util.List;

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

    public static final int MSG_TYPE_LEFT = 0;
    public static final int MSG_TYPE_RIGHT = 1;

    private Context mContext;
    private List<message_helperclass> mChat;

    FirebaseUser fUser;

    public MessageAdapter(Context mContext, List<message_helperclass> mChat){
        this.mChat = mChat;
        this.mContext = mContext;
    }


    @NonNull
    @Override
    public MessageAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        if (viewType == MSG_TYPE_RIGHT){
            View view = LayoutInflater.from(mContext).inflate(R.layout.chat_item_right, parent, false);
            return new MessageAdapter.ViewHolder(view);
        } else {
            View view = LayoutInflater.from(mContext).inflate(R.layout.chat_item_left, parent, false);
            return new MessageAdapter.ViewHolder(view);
        }
    }



    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        message_helperclass chat = mChat.get(position);

        holder.show_message.setText(chat.getMessage());

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView show_message;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            show_message = itemView.findViewById(R.id.show_message);
        }
    }

    @Override
    public int getItemViewType(int position) {
        fUser = FirebaseAuth.getInstance().getCurrentUser();
        if (mChat.get(position).getSender().equals(fUser.getUid())){
            return MSG_TYPE_RIGHT;
        } else {
            return MSG_TYPE_LEFT;
        }

    }
}
Und Constructor , Getter and Setter sieht so aus:

Code:
package com.example.myapplicationsonet;

public class message_helperclass {

    private String sender;
    private String receiver;
    private String message;

    public message_helperclass(String sender, String receiver, String message) {
        this.sender = sender;
        this.receiver = receiver;
        this.message = message;
    }

    public message_helperclass() {
    }

    public String getSender() {
        return sender;
    }

    public void setSender(String sender) {
        this.sender = sender;
    }

    public String getReceiver() {
        return receiver;
    }

    public void setReceiver(String receiver) {
        this.receiver = receiver;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
Ich hoffe einer von euch kann mir sagen, warum die Empfänger Nachrichten nicht angezeigt werden. Wie der Chat und die Datenbank aussieht, seht ihr im Bild.

Viele Grüße
 

Anhänge

J

jogimuc

Erfahrenes Mitglied
Hallo
Zu deinem Code.
Ich bin mir nicht sicher ob du hier wirklich die User ID vergleichst.
es wird wohl immer MSG_TYPE_RIGTH zurück gegeben.

Code:
fUser = FirebaseAuth.getInstance().getCurrentUser();
        if (mChat.get(position).getSender().equals(fUser.getUid())){
            return MSG_TYPE_RIGHT;
        } else {
            return MSG_TYPE_LEFT;
        }
Und hier greifst du nur auf die Nachricht zu.
Denn User wertest du nicht aus und setzt ihn auch nicht, in deinen Layout .

Code:
@Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        message_helperclass chat = mChat.get(position);
        holder.show_message.setText(chat.getMessage());
    }
 
Oben Unten