android - Firebase Chat Recycler View 左右视图不工作 Android
问题描述
嗨,我希望聊天消息在我发送消息时像这样对齐我希望它们在右侧当我收到我希望它们在左侧像图像中这样
但它看起来像这样,即使我为进出设置了两种不同的布局,但它以相同的方式出现
在 ChatRoomActvity 中,getItemViewType(int position) 始终返回为 MESSAGE_IN_VIEW_TYPE;
我在这里想念什么?
聊天室活动.java
private FirebaseAuth mFirebaseAuth;
private FirebaseUser mFirebaseUser;
private DatabaseReference mFirebaseDatabaseReference;
private FirebaseRecyclerAdapter<FriendlyMessage, MessageViewHolder>
mFirebaseAdapter;
public static final String MESSAGES_CHILD = "messages";
public static final String ANONYMOUS = "anonymous";
private static final String TAG = "ChatRoomAct";
private static final int REQUEST_IMAGE = 2;
private static final String LOADING_IMAGE_URL = "https://www.google.com/images/spin-32.gif";
private FloatingActionButton mSendButton;
private RecyclerView mMessageRecyclerView;
private LinearLayoutManager mLinearLayoutManager;
private ProgressBar mProgressBar;
private EditText mMessageEditText;
private ImageView mAddMessageImageView;
private String mUsername;
private String mPhotoUrl;
private String mUserid;
private String mSenderUid;
//Emoji Function
private ImageView emojiButton;
private EmojiPopup emojiPopup;
private ViewGroup rootView;
private EmojiEditText editText;
private final int MESSAGE_IN_VIEW_TYPE = 1;
private final int MESSAGE_OUT_VIEW_TYPE = 2;
public static class MessageViewHolder extends RecyclerView.ViewHolder {
TextView mTime;
CircleImageView imgProfile;
TextView messageTextView;
ImageView messageImageView;
TextView messengerTextView;
CircleImageView messengerImageView;
TextView mLikesCount;
ImageView imgDropdown, imgLikes;
public MessageViewHolder(View v) {
super(v);
messengerTextView = (TextView) itemView.findViewById(R.id.message_user);
messageTextView = (TextView) itemView.findViewById(R.id.message_text);
mTime = (TextView) itemView.findViewById(R.id.message_time);
messengerImageView = (CircleImageView) itemView.findViewById(R.id.imgDps);
imgLikes = itemView.findViewById(R.id.imgLikes);
mLikesCount = (TextView)itemView.findViewById(R.id.message_Likes);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat_room_actvity);
// Initialize ProgressBar and RecyclerView.
mProgressBar = (ProgressBar) findViewById(R.id.loader);
mMessageRecyclerView = (RecyclerView) findViewById(R.id.list);
mLinearLayoutManager = new LinearLayoutManager(ChatRoomActvity.this);
mLinearLayoutManager.setStackFromEnd(true);
mMessageRecyclerView.setLayoutManager(mLinearLayoutManager);
mFirebaseAuth = FirebaseAuth.getInstance();
mFirebaseUser = mFirebaseAuth.getCurrentUser();
mUserid = mFirebaseUser.getUid();
mUsername = ANONYMOUS;
if (mFirebaseUser == null) {
finish();
return;
} else {
mUsername = mFirebaseUser.getDisplayName();
if (mFirebaseUser.getPhotoUrl() != null) {
mPhotoUrl = mFirebaseUser.getPhotoUrl().toString();
}
}
displaychatmessages();
}
public void displaychatmessages() {
mFirebaseDatabaseReference = FirebaseDatabase.getInstance().getReference();
SnapshotParser<FriendlyMessage> parser = new SnapshotParser<FriendlyMessage>() {
@NonNull
@Override
public FriendlyMessage parseSnapshot(DataSnapshot snapshot) {
FriendlyMessage friendlyMessage = snapshot.getValue(FriendlyMessage.class);
if (friendlyMessage != null) {
friendlyMessage.setId(snapshot.getKey());
}
return friendlyMessage;
}
};
DatabaseReference messagesRef = mFirebaseDatabaseReference.child(MESSAGES_CHILD);
FirebaseRecyclerOptions<FriendlyMessage> options =
new FirebaseRecyclerOptions.Builder<FriendlyMessage>()
.setQuery(messagesRef, parser)
.build();
mFirebaseAdapter = new FirebaseRecyclerAdapter<FriendlyMessage, MessageViewHolder>(options) {
@Override
public int getItemViewType(int position) {
if(getItem(position).getId().equals(mFirebaseAuth.getCurrentUser().getUid()))
{
return MESSAGE_OUT_VIEW_TYPE;
} else {
return MESSAGE_IN_VIEW_TYPE;
}
}
@Override
protected void onBindViewHolder(MessageViewHolder viewHolder, int position, FriendlyMessage friendlyMessage) {
mProgressBar.setVisibility(ProgressBar.INVISIBLE);
if (friendlyMessage.getText() != null) {
viewHolder.messageTextView.setText(friendlyMessage.getText());
viewHolder.messageTextView.setVisibility(TextView.VISIBLE);
viewHolder.mTime.setText(DateFormat.format("dd MMM (h:mm a)", friendlyMessage.getMessageTime()));
viewHolder.mLikesCount.setText(String.valueOf(friendlyMessage.getMessageLikesCount()));
if (friendlyMessage.getMessageLikes() != null) {
if (friendlyMessage.getMessageLikes().containsValue(mUserid)) {
viewHolder.imgLikes.setImageResource(R.drawable.red_heart);
} else {
viewHolder.imgLikes.setImageResource(R.drawable.chat_heart);
}
}
}
viewHolder.messengerTextView.setText(friendlyMessage.getName());
if (friendlyMessage.getPhotoUrl() == null) {
viewHolder.messengerImageView.setImageDrawable(ContextCompat.getDrawable(ChatRoomActvity.this,
R.drawable.profile));
} else {
Glide.with(ChatRoomActvity.this)
.load(friendlyMessage.getPhotoUrl())
.into(viewHolder.messengerImageView);
}
}
@NonNull
@Override
public MessageViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = null;
if(i==MESSAGE_IN_VIEW_TYPE){
view = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.message_in, viewGroup, false);
}
else if(i==MESSAGE_OUT_VIEW_TYPE){
view = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.message_out, viewGroup, false);
}
return new MessageViewHolder(view);
}
};
mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
super.onItemRangeInserted(positionStart, itemCount);
int friendlyMessageCount = mFirebaseAdapter.getItemCount();
int lastVisiblePosition =
mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
// If the recycler view is initially being loaded or the
// user is at the bottom of the list, scroll to the bottom
// of the list to show the newly added message.
if (lastVisiblePosition == -1 ||
(positionStart >= (friendlyMessageCount - 1) &&
lastVisiblePosition == (positionStart - 1))) {
mMessageRecyclerView.scrollToPosition(positionStart);
}
}
});
mMessageRecyclerView.setAdapter(mFirebaseAdapter);
mMessageEditText = (EditText) findViewById(R.id.input);
mMessageEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (charSequence.toString().trim().length() > 0) {
mSendButton.setEnabled(true);
} else {
mSendButton.setEnabled(false);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
mSendButton = (FloatingActionButton) findViewById(R.id.btnSend);
mSendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FriendlyMessage friendlyMessage = new
FriendlyMessage(mUserid,mMessageEditText.getText().toString(),null,
mUsername,
mPhotoUrl,
null /* no image */);
mFirebaseDatabaseReference.child(MESSAGES_CHILD)
.push().setValue(friendlyMessage);
mMessageEditText.setText("");
}
});
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onResume() {
super.onResume();
mFirebaseAdapter.startListening();
}
@Override
protected void onPause() {
super.onPause();
mFirebaseAdapter.stopListening();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
public void onBackPressed() {
super.onBackPressed();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "onActivityResult: requestCode=" + requestCode + ", resultCode=" + resultCode);
if (requestCode == REQUEST_IMAGE) {
if (resultCode == RESULT_OK) {
if (data != null) {
final Uri uri = data.getData();
Log.d(TAG, "Uri: " + uri.toString());
FriendlyMessage tempMessage = new FriendlyMessage(null,null,null,mUsername, mPhotoUrl,
LOADING_IMAGE_URL);
mFirebaseDatabaseReference.child(MESSAGES_CHILD).push()
.setValue(tempMessage, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
if (databaseError == null) {
String key = databaseReference.getKey();
StorageReference storageReference =
FirebaseStorage.getInstance()
.getReference(mFirebaseUser.getUid())
.child(key)
.child(uri.getLastPathSegment());
putImageInStorage(storageReference, uri, key);
} else {
Log.w(TAG, "Unable to write message to database.",
databaseError.toException());
}
}
private void putImageInStorage(StorageReference storageReference, Uri uri, String key) {
storageReference.putFile(uri).addOnCompleteListener(ChatRoomActvity.this,
new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
if (task.isSuccessful()) {
task.getResult().getMetadata().getReference().getDownloadUrl()
.addOnCompleteListener(ChatRoomActvity.this,
new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
FriendlyMessage friendlyMessage =
new FriendlyMessage(null,null,null, mUsername, mPhotoUrl,
task.getResult().toString());
mFirebaseDatabaseReference.child(MESSAGES_CHILD).child(key)
.setValue(friendlyMessage);
}
}
});
} else {
Log.w(TAG, "Image upload task was not successful.",
task.getException());
}
}
});
}
});
}
}
}
}
}
友好消息.java
public class FriendlyMessage {
private String id;
private String text;
private String name;
private String photoUrl;
private String imageUrl;
private long messageTime;
private long messageLikesCount;
private Map<String, Boolean> messageLikes = new HashMap<>();
public FriendlyMessage(){}
public FriendlyMessage(String id,String text,String name, String photoUrl, String imageUrl) {
this.id = id;
this.text = text;
this.name = name;
messageTime = new Date().getTime();
this.photoUrl = photoUrl;
this.imageUrl = imageUrl;
this.messageLikesCount = messageLikesCount;
this.messageLikes= messageLikes;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public void setText(String text) {
this.text = text;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhotoUrl() {
return photoUrl;
}
public String getText() {
return text;
}
public void setPhotoUrl(String photoUrl) {
this.photoUrl = photoUrl;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
public long getMessageTime() {
return messageTime;
}
public void setMessageTime(long messageTime) {
this.messageTime = messageTime;
}
public long getMessageLikesCount() {
return messageLikesCount;
}
public void setMessageLikesCount(long messageLikesCount) {
this.messageLikesCount = messageLikesCount;
}
public Map<String, Boolean> getMessageLikes() {
return messageLikes;
}
public void setMessageLikes(Map<String, Boolean> messageLikes) {
this.messageLikes = messageLikes;
}
}
解决方案
@Override
public int getItemViewType(int position) {
FriendlyMessage friendlyMessage = getItem(position);
boolean user = (friendlyMessage.getUserid().equals(mUserid));
if(user)
{
return MESSAGE_OUT_VIEW_TYPE;
} else {
return MESSAGE_IN_VIEW_TYPE;
}
}
我使用布尔值