Skip to content

Commit

Permalink
Firebase Realtime Database 의 /chat_messages 경로와 RecyclerView 연동
Browse files Browse the repository at this point in the history
  • Loading branch information
allieus committed Dec 2, 2016
1 parent 8b44a23 commit e152b18
Show file tree
Hide file tree
Showing 4 changed files with 136 additions and 0 deletions.
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ dependencies {
compile 'com.sdsmdg.tastytoast:tastytoast:0.1.0'

compile 'com.google.firebase:firebase-database:10.0.0'
compile 'com.firebaseui:firebase-ui-database:1.0.1'

testCompile 'junit:junit:4.12'
}
Expand Down
17 changes: 17 additions & 0 deletions app/src/main/java/kr/festi/androidfirebasesample/ChatMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package kr.festi.androidfirebasesample;


public class ChatMessage {
public String message;
public String name;
public String photoUrl;

public ChatMessage() {
}

public ChatMessage(String message, String name, String photoUrl) {
this.message = message;
this.name = name;
this.photoUrl = photoUrl;
}
}
75 changes: 75 additions & 0 deletions app/src/main/java/kr/festi/androidfirebasesample/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
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.Log;
import android.view.Menu;
import android.view.MenuInflater;
Expand All @@ -17,11 +19,14 @@

import com.bumptech.glide.Glide;
import com.facebook.login.LoginManager;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;


public class MainActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener {
Expand All @@ -32,7 +37,14 @@ public class MainActivity extends AppCompatActivity implements GoogleApiClient.O

String mUsername;

RecyclerView mChatMessageListRecyclerView;
View mChatMessageListEmptyView;
LinearLayoutManager mLinearLayoutManager;
DatabaseReference mFirebaseDatabaseReference;
FirebaseRecyclerAdapter<ChatMessage, ChatMessageViewHolder> mFirebaseAdapter;

final String TAG = MainActivity.class.getName();
final String CHAT_MESSAGES_CHILD = "chat_messages";

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand Down Expand Up @@ -67,6 +79,56 @@ protected void onCreate(Bundle savedInstanceState) {
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API)
.build();

/*
* Firebase Realtime Database
*/
mChatMessageListRecyclerView = (RecyclerView) findViewById(R.id.messageListRecyclerView);
mChatMessageListEmptyView = findViewById(R.id.messageListEmptyView);
mChatMessageListEmptyView.setVisibility(View.GONE); // FIXME

mLinearLayoutManager = new LinearLayoutManager(this);
mLinearLayoutManager.setStackFromEnd(true);
mChatMessageListRecyclerView.setLayoutManager(mLinearLayoutManager);

mFirebaseDatabaseReference = FirebaseDatabase.getInstance().getReference();
mFirebaseAdapter = new FirebaseRecyclerAdapter<ChatMessage, ChatMessageViewHolder>(
ChatMessage.class,
R.layout.item_chat_message,
ChatMessageViewHolder.class,
mFirebaseDatabaseReference.child(CHAT_MESSAGES_CHILD)) {
@Override
protected void populateViewHolder(ChatMessageViewHolder viewHolder, ChatMessage chatMessage, int position) {
viewHolder.messageTextView.setText(chatMessage.message);
viewHolder.nameTextView.setText(chatMessage.name);
if ( chatMessage.photoUrl != null ) {
viewHolder.photoImageView.setVisibility(View.VISIBLE);
Glide.with(MainActivity.this)
.load(chatMessage.photoUrl)
.into(viewHolder.photoImageView);
}
else {
viewHolder.photoImageView.setVisibility(View.GONE);
}
}
};
mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeChanged(int positionStart, int itemCount) {
super.onItemRangeChanged(positionStart, itemCount);

int chatMessageCount = mFirebaseAdapter.getItemCount();
int lastVisiblePosition = mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
if ( lastVisiblePosition == -1 ||
(positionStart >= (chatMessageCount - 1) &&
(lastVisiblePosition == (positionStart - 1))) ) {
mChatMessageListRecyclerView.scrollToPosition(positionStart);
}
}
});

mChatMessageListRecyclerView.setLayoutManager(mLinearLayoutManager);
mChatMessageListRecyclerView.setAdapter(mFirebaseAdapter);
}

@Override
Expand Down Expand Up @@ -105,4 +167,17 @@ public void onClick(DialogInterface dialogInterface, int i) {
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Log.d(TAG, "onConnectionFailed:" + connectionResult);
}

public static class ChatMessageViewHolder extends RecyclerView.ViewHolder {
TextView messageTextView;
TextView nameTextView;
ImageView photoImageView;

public ChatMessageViewHolder(View itemView) {
super(itemView);
messageTextView = (TextView) itemView.findViewById(R.id.messageTextView);
nameTextView = (TextView) itemView.findViewById(R.id.nameTextView);
photoImageView = (ImageView) itemView.findViewById(R.id.photoImageView);
}
}
}
43 changes: 43 additions & 0 deletions app/src/main/res/layout/item_chat_message.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal">

<ImageView
android:id="@+id/photoImageView"
android:layout_width="36dp"
android:layout_height="36dp" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:gravity="center_vertical"
android:orientation="vertical">

<TextView
android:id="@+id/messageTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:textAppearance="?android:attr/textAppearanceLarge"/>

<TextView
android:id="@+id/nameTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:textAppearance="?android:attr/textAppearanceSmall"/>
</LinearLayout>

</LinearLayout>


</LinearLayout>

0 comments on commit e152b18

Please sign in to comment.