java - Android - Firebase - 将用户发送到聊天室

标签 java android firebase firebase-realtime-database chat

瞄准

允许用户访问他们选择的群聊。用户单击群聊名称后,他们将进入该群聊。

数据库树

enter image description here

如数据库树中所示,当前登录的用户将看到已创建的群聊名称列表。

我有一个管理员帐户来为用户创建这些群聊。

数据库中看到的 Android、亚洲和欧洲群聊不是固定变量。它们是名字。新的群聊名称可以是“地球”。

因此,除了由节点本身调用之外,没有其他方法可以通过变量来调用它。

应用程序屏幕截图

  1. 群聊列表2.进入群聊

image2 image3

Activity 流程

  1. GroupFragment ---> 聊天 Activity

  2. GroupFragment <--- 聊天 Activity

申请流程

用户--->登录 Activity --->用户 Activity --->GroupFrag--->GroupChatActivity

在(GroupFrag--->GroupChatActivity)用户必须在GroupFrag中选择一个群聊名称才能进入GroupChatActivity

用户必须在 GroupFrag 中选择群聊名称才能进入 GroupChatActivity

描述

  1. 用户将能够选择群聊名称(从 GroupFragment 中),应用程序会将用户带入群聊本身(进入聊天 Activity )。用户将能够返回 GroupFragment 并选择另一个所需的组。

(群聊名称不固定——它们不是可以调用的节点)

问题

  1. 在 fragment 中提示后,我无法选择群聊名称,然后 fragment 会将我带到群聊。

组 fragment

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


        class GroupAdapter extends RecyclerView.Adapter<GroupAdapter.MyHolder> {

            ArrayList<String> list;

            public GroupAdapter(ArrayList<String> list) {
                this.list = list;
            }


            @Override
            public GroupAdapter.MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_groups, parent, false);

                return new MyHolder(view);
            }

            @Override
            public void onBindViewHolder(MyHolder holder, int position) {
                holder.setText(list.get(position));
            }

            @Override
            public int getItemCount() {
                return list.size();
            }

            class MyHolder extends RecyclerView.ViewHolder {
                TextView nameTextView;

                public MyHolder(View itemView) {
                    super(itemView);
                    nameTextView = itemView.findViewById(R.id.groupChatNameTxt);
                }

                public void setText(String groupName) {
                    nameTextView.setText(groupName);
                }
            }
        }

        jGroupsDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                ArrayList<String> groupChatNames = new ArrayList<>();
                for (DataSnapshot child : dataSnapshot.getChildren()) {
                    groupChatNames.add(child.getKey());
                }
                GroupAdapter adapter = new GroupAdapter(groupChatNames);
                jGroupChatList.setAdapter(adapter);

                //I'm not sure where to write a code for userID
                //final String usersID = getRef(position).getKey();
// When the user clicks on one of the group chat names, he/she will be sent to the Chat Activity

                jGroupChatList.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent intentUserProfile = new Intent(getActivity(), ChatActivity.class);
                        intentUserProfile.putExtra("groupChatName",groupName);
                        intentUserProfile.putExtra("neighbourhood", neighbourhood);
                        intentUserProfile.putExtra("usersName", usersName);
                        intentUserProfile.putExtra("usersID", usersID);
                        startActivity(intentUserProfile);
                    }
                });
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
    }

聊天 Activity

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

        jGroupChatName = getIntent().getExtras().get("groupChatName").toString();
        jUserID = getIntent().getExtras().get("usersID").toString();
        jUserName = getIntent().getExtras().get("usersName").toString();
        jUserNeighbourhood = getIntent().getExtras().get("neighbourhood").toString();

        jChatRoot = FirebaseDatabase.getInstance().getReference().child(jGroupChatName);

        jChatToolbar = (Toolbar) findViewById(R.id.allUSersToolBar);
        setSupportActionBar(jChatToolbar);
        getSupportActionBar().setTitle(jGroupChatName); // Show the name of the selected group name
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        }

其他评论

  • 在线教程

我在 YouTube 上观看了 Android Firebase 群聊教程。链接为https://www.youtube.com/watch?v=wVCz1a3ogqk 。但它没有提供我想要实现的一些特性/功能。

  • 链接问题

Android - Firebase - Prompting Group Chat Names

future 实现

对于 future 的实现,我想发送和检索消息并将其提示到群聊中,以便用户像真正的群聊一样查看。当然,我会将其留给另一个问题。

最佳答案

您可以按如下方式更新适配器和 View 持有者实现:

public class Adapter extends RecyclerView.Adapter<Adapter.MyHolder> {

    Context context;
    ArrayList<String> list;

    public Adapter(Context context, ArrayList<String> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public Adapter.MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_groups, parent, false);
        MyHolder holder = new MyHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyHolder holder, int position) {
        holder.setText(list.get(position));
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    class MyHolder extends RecyclerView.ViewHolder {
        TextView nameTextView;
        View.OnClickListener onClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String groupName = list.get(getAdapterPosition());
                Intent intentUserProfile = new Intent(context, MainActivity.class);
                intentUserProfile.putExtra("groupChatName", groupName);
                // If fixed, you should pass these values to adapter's constructor
                // intentUserProfile.putExtra("neighbourhood", neighbourhood);
                // intentUserProfile.putExtra("usersName", usersName);
                // intentUserProfile.putExtra("usersID", usersID);
                context.startActivity(intentUserProfile);
            }
        };

        public MyHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(onClickListener);
            nameTextView = (TextView) itemView.findViewById(R.id.groupChatNameTxt);
        }

        public void setText(String groupName) {
            nameTextView.setText(groupName);
        }
    }
}

您还必须在 GroupFragment 中更新此行:

GroupAdapter adapter = new GroupAdapter(getActivity(), groupChatNames);
<小时/>

这是您可以在 fragment 中实现的另一个解决方案,以便您可以在 Intent 中添加额外内容(实际上是从 former question 修改的):

@Override
public void onStart() {
    super.onStart();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference groupChatsRef = rootRef.child("Group Chats");
    FirebaseRecyclerAdapter<String, GroupChatViewHolder> chatAdapter = new FirebaseRecyclerAdapter<String, GroupChatViewHolder>(
            String.class,
            R.layout.layout_groups,
            GroupChatViewHolder.class,
            groupChatsRef) {
        protected void populateViewHolder(GroupChatViewHolder viewHolder, String model, int position) {
            final String groupChatName = this.getRef(position).getKey();
            viewHolder.setName(groupChatName);
            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intentUserProfile = new Intent(getActivity(), ChatActivity.class);
                    intentUserProfile.putExtra("groupChatName", groupChatName);
                    intentUserProfile.putExtra("neighbourhood", neighbourhood);
                    intentUserProfile.putExtra("usersName", usersName);
                    intentUserProfile.putExtra("usersID", usersID);
                    startActivity(intentUserProfile);
                }
            });
        }
    };
    jGroupChatList.setAdapter(chatAdapter);
}

请注意,它会将数据库中的字符串群聊天条目作为键值对进行处理。

关于java - Android - Firebase - 将用户发送到聊天室,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46435225/

相关文章:

java程序在windows中等待1小时

Java 图形更新/重绘图形

android - Firebase 上用于推送通知的触发器

firebase - 如何不触发初始子项的事件 child_added

java - Android - Firebase - 无法将 java.util.HashMap 类型的值转换为字符串

java - getConnection() 和 ResultSet 中的错误

java - Activiti中通过execution-id识别任务类型

android - Email Composer 插件不适用于带有 cordova 的 Android 6 (Marsh Mallow)

java - 如何实现Android详细通知?

android - react-native react-navigation-drawer 在 App 启动时默认保持打开状态