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

Posted

技术标签:

【中文标题】Android - Firebase - 将用户发送到聊天室【英文标题】:Android - Firebase - Send Users to Chat Room 【发布时间】:2018-03-08 04:40:55 【问题描述】:

瞄准

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

数据库树

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

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

在数据库中看到的 android、亚洲和欧洲群聊不是固定变量。他们是名字。一个新的群聊名称可能是“地球”。

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

应用截图

    群聊列表2.进入群聊

活动流程

    GroupFragment ---> 聊天活动

    GroupFragment

申请流程

User--->LoginActivity--->UserActivity--->GroupFrag--->GroupChatActivity

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

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

说明

    用户将能够选择群聊名称(来自 GroupFragment),应用程序会将用户带入群聊本身(进入聊天活动)。用户将能够返回到 GroupFragment 并选择另一个所需的组。

(群聊名称未修复 -- 它们不是可以调用的节点)

问题

    在片段中提示后,我无法选择群聊名称,然后将我带到群聊。

组片段

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

聊天活动

@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

未来的实现

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

【问题讨论】:

您的groups 是静态的还是动态的 我的组名是动态的。如果我要添加一个名为“地球”的群聊,那么就会有一个名为“地球”的群聊。名称不是固定的。我应该为课程添加整个代码吗?现在我只添加了重要的。这意味着我已经排除了导入、私有等。我发布的代码只是函数。感谢您回答这个问题=D 澄清一下 - 你有一个对应于群聊节点的 listView 吗?在示例中,listView 有 3 个值?你想说当用户点击 listView 时,他们的用户名(一个变量)被附加到群聊节点? @Torewin 是的,这就是我打算做的。就像群聊一样。如果我要进入群聊,我的用户节点中的“姓名”将被检索并带入“群聊”节点内的“群聊名称” @TheStudent123 这样您就可以访问您的 listView 以便您可以获取单击项目的标题并将其传递给 chatview 活动。这意味着当用户进入聊天室时,他们将根据他们的选择进入正确的房间。当您这样做时,只需使用 updateValues 将用户的 uuid 添加到所选项目? 【参考方案1】:

您可以按如下方式更新您的适配器和查看器实现:

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);

这是您可以在片段中实现的另一种解决方案,以便您可以在意图中添加额外内容(实际上是从您的 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);

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

【讨论】:

你好@Mehmed,我必须再次麻烦你另一个问题,因为我没有收到任何答案。链接是:***.com/questions/46471541/…希望你能抽出时间来帮助我。谢谢【参考方案2】:
    public class group_name_list_adapter extends RecyclerView.Adapter<group_name_list_adapter.ViewHolder> 

        private List< group_name_list> listItems;
        private Context context;
        OnItemClickListener onItemClickListener;

        public group_name_list_adapter(List<group_name_list> listItems, Context context) 
            this.listItems = listItems;
            this.context = context;
        

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
            View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.group_name_list, parent, false);
            return new ViewHolder(v);
        

        @Override
        public void onBindViewHolder(ViewHolder holder, final int position) 
            group_name_list listItem = listItems.get(position);

            holder.txtTitle.setText(listItem.getTxtTitle());
            holder.txtTitle.setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View v) 
                    onItemClickListener.onGroupNameClick(position);
                
            );
        

        @Override
        public int getItemCount() 
            return listItems.size();
        

        public class ViewHolder extends RecyclerView.ViewHolder 

            public TextView txtTitle;

            public ViewHolder(View itemView) 
                super(itemView);
                txtTitle = (TextView) itemView.findViewById(R.id.txtTitle);
            
        
        public void setOnItemClickListener(OnItemClickListener onItemClickListener)
            this.onItemClickListener = onItemClickListener;
        

        public interface OnItemClickListener
            void onGroupNameClick(int position); 
        
    



    public class group_name_list 

        private String txtTitle;

        public group_name_list(String txtTitle) 
            this.txtTitle = txtTitle;
        

        public String getTxtTitle() 
            return txtTitle;
        
    



    public class ChatActivity implements group_name_list_adapter.OnItemClickListener

    private RecyclerView recyclerGroupName;
    private group_name_list_adapter groupNameAdapter;
    private List<group_name_list> group_name_List;
    private List<String> groupNameKeyList; //This is optional – this is used if you wanted the group chats to have the same name instead of overwriting the groupchat when creating.

    Inside your Firebase call:

    group_name_List.removeAll(group_name_List t);
    groupNameKeyList.removeAll(groupNameKeyList);
    //Depending on your firebase reference. This could just be dataSnapshot.getChildren()
    for (DataSnapshot child : dataSnapshot.child("Group Chats").getChildren())


        if (!child.getKey().equals(null))
            groupNameKeyList.add(child.getKey().toString()); //Again this is optional
        

        group_name_list newGroupList = child.getValue();
        );
        groupNameList.add(newGroupList);
    
    recyclerGroupName.setAdapter(groupNameAdapter);

    gLayoutAttribute = new GridLayoutManager(getActivity(), 1);
    recyclerGroupName = (RecyclerView) rootView.findViewById(R.id.recyclerGroupName);
    recyclerGroupName.setHasFixedSize(true);
    recyclerGroupName.setLayoutManager(new LinearLayoutManager(this.getContext()));
    recyclerGroupName.setLayoutManager(gLayoutAttribute);


@Override
    public void onAttributeClick(int position) 
        Intent intentUserProfile = new Intent(getActivity(), ChatActivity.class);
        intentUserProfile.putExtra("groupChatName",groupName);
        intentUserProfile.putExtra("neighbourhood", neighbourhood);
        intentUserProfile.putExtra("usersName", usersName);
        intentUserProfile.putExtra("usersID", usersID);
        intent.putExtra("name", groupList.get(position).toString());
        //intent.putExtra("name", groupListKeyList.get(position).toString()); this is your optional key
        startActivity(intentUserProfile);
    

【讨论】:

我收到此错误,无法解析方法 'setOnItemClickListener(anonymous android.widget.AdapterView.OnItemClickListener)' 并且我也无法解析 get(position) 请帮助解决此问题 好的,谢谢。哦,Firebase 监听器?好吧我试试=D 告诉我这是否适合您 - 在您的 GroupChat 顶部添加 implements GroupAdapter.OnItemClickListener。您可能需要移动一些东西。我可以在聊天室里更好地帮助你。 我尝试实现implements GroupAdapter.OnItemClickListener,但它显示“无法解析符号'OnItemClickListener”。是的!!我也想和你在聊天室讨论这个问题,但我找不到那个聊天选项:(我应该发布整个代码吗?这样你就可以拥有和我完全相同的文件。这个问题也是链接到***.com/questions/46412882/… 让我知道这是否对您有帮助。【参考方案3】:

按照这个试试

    假设您在FirebaseDatabase 中创建了5 user's 和不同的UID's 在此步骤中,您必须从Firebaseget all user's 并将其显示在RecyclerViewRecyclerview's adapter classonBindViewHolder' you have to do like 从您在创建组时生成的列表中添加和删除用户。 在此步骤中,您必须搜索firebaseDatabase 用户的Uid,当前为logged in,如果您的UID is matched 在任何Group 中找到,则您需要获取Group-name

很高兴为您提供帮助

【讨论】:

但我不打算提示用户进入列表视图来查看它们。我的意图是:Flow Flow User--->LoginActivity--->UserActivity--->GroupFrag--->GroupChatActivity 在 (GroupFrag--->GroupChatActivity) 用户必须在 GroupFrag 中选择一个群聊名称以进入 GroupChatActivity 用户不能创建我们自己的组,否则谁创建group 只有管理员才能创建群组。这部分代码是我添加到问题中的“链接问题”。 每个用户可以创建或不创建自己的组

以上是关于Android - Firebase - 将用户发送到聊天室的主要内容,如果未能解决你的问题,请参考以下文章

Android - Firebase - 不同类型的用户登录

如何将用户的 ArrayList 存储在 Android 的 Firebase 数据库中?

Android - 将视频/音频文件上传到 Firebase 存储

Android Firebase如何在特定用户下保存和检索数据

如何从android上的firebase获取用户uid?

如何在android中更改firebase用户[重复]