android - 我想获取我在 recyclerview 中选择的用户 ID 列表,以便将它们添加到群聊
问题描述
我正在创建一个类似于whatsapp的聊天应用程序,在用户创建组的部分,我想添加我从列表中选择的所有用户,换句话说,并返回他们的ID,以便他们可以按顺序存储在firebase中在该特定组中发送的消息将到达该组中的每个用户。但是我迷失了如何去做。以下是我的 recyclerView 中的代码:
public class RecyclerViewAdapterAddUsers extends RecyclerView.Adapter<RecyclerViewAdapterAddUsers.ViewHolder> {
Admin admin;
// variable to store admin uid from sharePreference
//String admin_uid;
private Context mCtx;
private List<Users> mUsers;
private boolean isChat;
// string variable to contain lastMessage from user
private String theLastMessage;
public RecyclerViewAdapterAddUsers(Context mCtx, List<Users> mUsers, boolean isChat){
this.mCtx = mCtx;
this.mUsers = mUsers;
this.isChat = isChat;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recyclerview_add_users,parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
// gets the positions of the all users
final Users users = mUsers.get(position);
// sets username to the text of the textView
holder.username.setText(users.getUsername());
if(users.getImageUrl() == null){
// loads the default placeholder into ImageView if ImageUrl is null
holder.profile_pic.setImageResource(R.drawable.ic_person_unknown);
}
else{
// loads users image into the ImageView
Glide.with(mCtx).load(users.getImageUrl()).into(holder.profile_pic);
}
holder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// checks if check box is checked
if(holder.checkBox.isChecked()){
Toast.makeText(mCtx, "User is checked", Toast.LENGTH_SHORT).show();
}
else{
}
}
});
}
@Override
public int getItemCount() {
return mUsers.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder{
Admin admin;
CircleImageView profile_pic;
TextView username;
TextView last_msg;
CheckBox checkBox;
// status online or offline indicators
CircleImageView status_online;
CircleImageView status_offline;
public ViewHolder(View itemView) {
super(itemView);
profile_pic = itemView.findViewById(R.id.profile_image);
username = itemView.findViewById(R.id.username);
checkBox = itemView.findViewById(R.id.add_user);
status_online = itemView.findViewById(R.id.status_online);
status_offline = itemView.findViewById(R.id.status_offline);
last_msg = itemView.findViewById(R.id.last_msg);
}
}
// checks for last message
private void lastMessage(final String user_id, final TextView last_msg){
theLastMessage = "default";
// getting the uid of the admin stored in shared preference
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mCtx);
final String admin_uid = preferences.getString("uid","");
DatabaseReference lastMsgRef = FirebaseDatabase.getInstance().getReference("Chats");
lastMsgRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot snapshot : dataSnapshot.getChildren()){
Chats chats = snapshot.getValue(Chats.class);
assert chats != null;
// compares the uid of the admin and user and return the last message
if(chats.getReceiver().equals(admin_uid) && chats.getSender().equals(user_id)
|| chats.getReceiver().equals(user_id) && chats.getSender().equals(admin_uid)){
theLastMessage = chats.getMessage();
}
}
// switch case for theLastMessage
switch (theLastMessage){
case "default":
last_msg.setText(R.string.no_message);
break;
default:
last_msg.setText(theLastMessage);
break;
}
theLastMessage = "default";
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
// display error message if one should occur
Toast.makeText(mCtx, databaseError.getMessage(),Toast.LENGTH_LONG).show();
}
});
}
}
解决方案
我放了一个箭头(像这样<----)你必须对你的代码进行更改
public class RecyclerViewAdapterAddUsers extends RecyclerView.Adapter<RecyclerViewAdapterAddUsers.ViewHolder> {
Admin admin;
// variable to store admin uid from sharePreference
//String admin_uid;
private Context mCtx;
private List<Users> mUsers;
private boolean isChat;
// string variable to contain lastMessage from user
private String theLastMessage;
// strings to store the ids of chat users <--------------------------------------------
private List<String> selectedUsersIds;
//getter method
List<String> getUserIdsList(){
return selectedUsersIds;
}
public RecyclerViewAdapterAddUsers(Context mCtx, List<Users> mUsers, boolean isChat){
this.mCtx = mCtx;
this.mUsers = mUsers;
this.isChat = isChat;
selectedUsersIds = new ArrayList<String>(); // <--------------------------------------------
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recyclerview_add_users,parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
// gets the positions of the all users
final Users users = mUsers.get(position);
// sets username to the text of the textView
holder.username.setText(users.getUsername());
if(users.getImageUrl() == null){
// loads the default placeholder into ImageView if ImageUrl is null
holder.profile_pic.setImageResource(R.drawable.ic_person_unknown);
}
else{
// loads users image into the ImageView
Glide.with(mCtx).load(users.getImageUrl()).into(holder.profile_pic);
}
holder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// checks if check box is checked
if(holder.checkBox.isChecked()){
Toast.makeText(mCtx, "User is checked", Toast.LENGTH_SHORT).show();
//add the user id to the list <--------------------------------------------
selectedUsersIds.add(users.getId()); // or whatever the method to get the user id name have <--------------------------------------------
}
else{
//remove the id if the user it's unchecked <--------------------------------------------
selectedUsersIds.remove(users.getId()); // <--------------------------------------------
}
}
});
}
@Override
public int getItemCount() {
return mUsers.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder{
Admin admin;
CircleImageView profile_pic;
TextView username;
TextView last_msg;
CheckBox checkBox;
// status online or offline indicators
CircleImageView status_online;
CircleImageView status_offline;
public ViewHolder(View itemView) {
super(itemView);
profile_pic = itemView.findViewById(R.id.profile_image);
username = itemView.findViewById(R.id.username);
checkBox = itemView.findViewById(R.id.add_user);
status_online = itemView.findViewById(R.id.status_online);
status_offline = itemView.findViewById(R.id.status_offline);
last_msg = itemView.findViewById(R.id.last_msg);
}
}
// checks for last message
private void lastMessage(final String user_id, final TextView last_msg){
theLastMessage = "default";
// getting the uid of the admin stored in shared preference
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mCtx);
final String admin_uid = preferences.getString("uid","");
DatabaseReference lastMsgRef = FirebaseDatabase.getInstance().getReference("Chats");
lastMsgRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot snapshot : dataSnapshot.getChildren()){
Chats chats = snapshot.getValue(Chats.class);
assert chats != null;
// compares the uid of the admin and user and return the last message
if(chats.getReceiver().equals(admin_uid) && chats.getSender().equals(user_id)
|| chats.getReceiver().equals(user_id) && chats.getSender().equals(admin_uid)){
theLastMessage = chats.getMessage();
}
}
// switch case for theLastMessage
switch (theLastMessage){
case "default":
last_msg.setText(R.string.no_message);
break;
default:
last_msg.setText(theLastMessage);
break;
}
theLastMessage = "default";
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
// display error message if one should occur
Toast.makeText(mCtx, databaseError.getMessage(),Toast.LENGTH_LONG).show();
}
});
}
}
然后,在您实例化适配器的类中,调用 userIds 列表的 get 方法,类似这样。
List<String> userIds = adapter.getUserIdsList();
这样您就可以使用所选用户 ID 列表做任何您想做的事情
推荐阅读
- git - Gitlab 12.X - 从预接收挂钩中的存储路径获取项目 ID
- git - Pull 不会更新子模块上的当前本地分支
- android - 设置 FMOD
- http - 将 cURL 请求转换为 Axios Post
- c# - XmlException: 遇到了意外的字符 '
- android - 即使我完成了应用程序,它也会继续返回到以前的活动
- physical-design - 蓝牙 5 PHY 层(适用于所有 4 种模式)
- python - 一个文件夹中的模块和有效的 PYTHONPATH 出现“未命名模块”错误
- npm - npm publish 将 .gitignore 重命名为 .npmignore
- python - 时间变量在服务器中不起作用,但在本地运行良好。PYTHON