首页 > 解决方案 > 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;
}

}

标签: androidfirebasefirebase-realtime-database

解决方案


        @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;
            }
        }

我使用布尔值


推荐阅读