首页 > 解决方案 > 我想获取我在 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();
            }
        });
    }

}

标签: androidfirebasefirebase-realtime-database

解决方案


我放了一个箭头(像这样<----)你必须对你的代码进行更改

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 列表做任何您想做的事情


推荐阅读