android - 如何在聊天应用程序中将 FirebaseRecyclerAdapter 用于两个项目布局

标签 android firebase firebase-realtime-database firebaseui

我正在制作一个使用 firebase 作为后端的聊天应用程序。 目前我在设置用于在 RecyclerView 中发送和接收消息的项目布局时遇到问题。 当我对发送和接收消息使用相同的项目布局时,它工作得很好。 但我想将屏幕分成两部分,左侧用于发送消息,右侧用于接收消息。 在制作 FirebaseRecyclerAdapter 对象时,我只能传递一个布局作为其参数。我真的在为这个问题苦苦挣扎。希望有人能帮助我。

private void loadMessages() {

    mAdapter = new FirebaseRecyclerAdapter<MessageToSend, NewMessageViewHolder>(
            MessageToSend.class,
            R.layout.single_message_new,
            NewMessageViewHolder.class,
            messageRef.child(sender).child(receiver)
    ) {
        @TargetApi(Build.VERSION_CODES.M)
        @Override
        protected void populateViewHolder(NewMessageViewHolder viewHolder, MessageToSend model, int position) {
            if (sender.equals(model.getSender())) {

                viewHolder.outMessage.setTextColor(getResources().getColor(R.color.darkGreen));
            }
            else {
                viewHolder.outMessage.setTextColor(Color.BLACK);
                //viewHolder.outMessage.setGravity(Gravity.RIGHT);
            }
            viewHolder.outMessage.setText(model.getMessage());
            viewHolder.sender.setText(model.getSender());
        }
    };

    mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            super.onItemRangeInserted(positionStart, itemCount);
            int friendlyMessageCount = mAdapter.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))) {
                recyclerView.scrollToPosition(positionStart);
            }
        }
    });
    recyclerView.setLayoutManager(mLinearlayoutManager);
    recyclerView.setAdapter(mAdapter);
}

ViewHolder 类

public static class InMessageViewHolder extends RecyclerView.ViewHolder{
    TextView inMessage;
    TextView receiver;
    CircleImageView receiverImage;

    public InMessageViewHolder(View itemView) {
        super(itemView);
        inMessage = (TextView) itemView.findViewById(R.id.textView11);
        receiver = (TextView) itemView.findViewById(R.id.textView12);
    }
} 

最佳答案

您可以覆盖 getItemViewTypeFirebaseRecyclerAdapter实现这一目标:

 // Check if the item at position is sender
 private boolean isSender(int position) {
   sender.equals(getItem(position).getSender());
 }

 @Override
 public int getItemViewType(int position) {
     if (isSender(position)) {
         return R.layout.my_sender_layout;
     } else {
         return R.layout.my_receiver_layout;
     }
 }

这将导致 RecyclerAdapter有条件地膨胀布局。但是你仍然只能有一个 ViewHolder子类,因此您需要确保在实现时 public MyViewHolder(View itemView)你的代码是为 itemView 准备的成为两个布局之一,如果这些布局有不同的内容,那么一些 findViewById调用将返回 null。

关于android - 如何在聊天应用程序中将 FirebaseRecyclerAdapter 用于两个项目布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39078698/

相关文章:

android - ProGuard 构建警告 - org.apache.http.entity

java - 为什么在 Google Playstore 上发布应用程序后,数据无法从 Firebase 加载到应用程序中?

java - 如何使用 Spring Rest 模板从 Firebase 接收随机生成的 json 值?

android - 蓝牙发现无效

android - org.json.JSONException : Value of type java. lang.String 无法转换为 JSONObject

与 Delphi 10.4.2 一起使用的 Android 模拟器

swift - 如何在不同类中共享数据

angular - 无法添加任务 ':processDebugGoogleServices',因为同名任务已存在

java - 查询 firebase 数据库并检索有限的数据

firebase - 如何在单个事务中将图像上传到 firebase 存储并在数据库中保存引用?