0

I want to create a chatapp. But in the recyclerview i only can receive the messages from the usermsg databasereference. I dont know how I should code it that i shows 2 recyclerviews. Does someone got an idea? Thanks

Chat Activity

package highelo.drivetogether;

import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.provider.ContactsContract;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.firebase.database.ChildEventListener;
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 com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class Chat extends AppCompatActivity {

    RecyclerView mFriendMsg;
    RecyclerView mUserMsg;
    private Button SendMsg;
    private EditText EditMsg;

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

        final Intent s = getIntent();
        final String userID = s.getStringExtra("UID");

        final Intent i = getIntent();
        final String post_UserID = i.getStringExtra("FID");

        SendMsg = (Button) findViewById(R.id.send_msg);
        EditMsg = (EditText) findViewById(R.id.edit_msg);

        mUserMsg = (RecyclerView) findViewById(R.id.chat_conr);
        mUserMsg.setHasFixedSize(true);
        mUserMsg.setLayoutManager(new LinearLayoutManager(this));

        mFriendMsg = (RecyclerView) findViewById(R.id.chat_conr);
        mFriendMsg.setHasFixedSize(true);
        mFriendMsg.setLayoutManager(new LinearLayoutManager(this));
    }

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

        final Intent s = getIntent();
        final String userID = s.getStringExtra("UID");

        final Intent i = getIntent();
        final String post_UserID = i.getStringExtra("FID");

        DatabaseReference FriendMsg = FirebaseDatabase.getInstance().getReference().child("Users").child(userID).child("Chats").child(post_UserID).child("Chat");
        DatabaseReference UserMsg = FirebaseDatabase.getInstance().getReference().child("Users").child(post_UserID).child("Chats").child(userID).child("Chat");

        final FirebaseRecyclerAdapter<Blog, BlogViewHolder2> firebaseRecyclerAdapter2 = new FirebaseRecyclerAdapter<Blog, BlogViewHolder2>(
                Blog.class,
                R.layout.inchat_row2,
                BlogViewHolder2.class,
                UserMsg) {
            @Override
            protected void populateViewHolder(BlogViewHolder2 viewHolder, Blog model, int position) {
                viewHolder.setNachricht(model.getNachricht());
                viewHolder.setImage(Chat.this, model.getFImage());
            }
        };
        mUserMsg.setAdapter(firebaseRecyclerAdapter2);

        final FirebaseRecyclerAdapter<Blog, BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>(
                Blog.class,
                R.layout.inchat_row,
                BlogViewHolder.class,
                FriendMsg) {

            @Override
            public void populateViewHolder(final BlogViewHolder viewHolder, Blog model, int position) {
                viewHolder.setNachricht(model.getNachricht());
                viewHolder.setImage(Chat.this, model.getFImage());
            }
        };
        mFriendMsg.setAdapter(firebaseRecyclerAdapter);
    }

    public static class BlogViewHolder2 extends  RecyclerView.ViewHolder{
        View mView;
        public BlogViewHolder2(View itemView) {
            super(itemView);
            mView = itemView;
        }
        public void setNachricht(String Nachricht){
            TextView post_Nachricht = (TextView)mView.findViewById(R.id.finchat_mess);
            post_Nachricht.setText(Nachricht);
        }
        public void setImage(Context ctx, String FImage){
            ImageView post_image = (ImageView)mView.findViewById(R.id.finchat_image);
            Picasso.with(ctx).load(FImage).fit().centerCrop().into(post_image);
        }
    }

    public static class BlogViewHolder extends  RecyclerView.ViewHolder{
        View mView;
        public BlogViewHolder(View itemView) {
            super(itemView);
            mView = itemView;
        }
        public void setNachricht(String Nachricht){
            TextView post_Nachricht = (TextView)mView.findViewById(R.id.uinchat_mess);
            post_Nachricht.setText(Nachricht);
        }
        public void setImage(Context ctx, String FImage){
            ImageView post_image = (ImageView)mView.findViewById(R.id.uinchat_image);
            Picasso.with(ctx).load(FImage).fit().centerCrop().into(post_image);
        }
    }
}

chat_activity

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="1">


    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="492dp"
        android:id="@+id/chat_conr"
        android:layout_weight="1.11"
        android:layout_alignParentTop="true"
        android:layout_alignRight="@+id/send_msg"
        android:layout_alignEnd="@+id/send_msg"
        android:layout_above="@+id/edit_msg" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/edit_msg"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_toStartOf="@+id/send_msg"
        android:layout_toLeftOf="@+id/send_msg" />

    <Button
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:text="Senden"
        android:id="@+id/send_msg"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>

Inchat_row

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_margin="1dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <de.hdodenhof.circleimageview.CircleImageView
            android:layout_width="54dp"
            android:layout_height="54dp"
            android:id="@+id/uinchat_image"
            app:civ_border_width="1dp"
            app:civ_border_color="#ff0000"/>


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/uinchat_mess"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:paddingLeft="5dp"
            android:textSize="13dp"
            android:paddingBottom="4dp"
            android:singleLine="true"
            android:layout_alignParentTop="true"
            android:layout_toEndOf="@+id/uinchat_image"
            android:layout_alignBottom="@+id/uinchat_image" />


    </RelativeLayout>

</android.support.v7.widget.CardView>

Inchat2_row

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_margin="1dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <de.hdodenhof.circleimageview.CircleImageView
            android:layout_width="54dp"
            android:layout_height="54dp"
            android:id="@+id/finchat_image"
            app:civ_border_width="1dp"
            app:civ_border_color="#ff0000"
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true" />


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/finchat_mess"
            android:layout_alignParentEnd="false"
            android:paddingLeft="5dp"
            android:textSize="13dp"
            android:paddingBottom="4dp"
            android:singleLine="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_toLeftOf="@+id/finchat_image"
            android:layout_alignBottom="@+id/finchat_image" />


    </RelativeLayout>

</android.support.v7.widget.CardView>
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
Markus Biermeier
  • 103
  • 1
  • 11

1 Answers1

0

The usual way to have a chat between two people is to model that chat room in your database:

ChatRooms
  ChatRoomBetweenUser1AndUser2
    -KLM.......24
      name: "User One"
      uid: "uidOfUser1"
      text: "Hello there. This is your friend User One"
    -KMN.......35
      name: "User Two"
      uid: "uidOfUser2"
      text: "Hello User One, this is User Two. Over"

That way you only need to load data from one location and need only one RecyclerView.

For more information on how to efficiently model chat rooms names for this scenario, see Best way to manage Chat channels in Firebase.

To get a good start on building a chat app, follow the Firebase Codelab for Android.

For a good introduction into modeling your data as your app needs it, see this article on NoSQL data modeling.

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