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
在此步骤中,您必须从Firebase
到get all user's
并将其显示在RecyclerView
在Recyclerview's adapter class
中onBindViewHolder' 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 存储