Skip to main content
The channel member manager is responsible for managing member information within channels, including getting member lists, searching members, modifying member remarks, and other functions.
Need to implement channel member data source: Channel Member Data Source

Get Channel Members

Get All Members

// Get all members in a channel
WKIM.getInstance().getChannelMembersManager().getMembers(channelId, channelType);

Get Single Member

// Get single channel member
WKIM.getInstance().getChannelMembersManager().getMember(channelId, channelType, uid);

Complete Usage Example

public class GroupMembersActivity extends AppCompatActivity {
    
    private String channelId;
    private byte channelType;
    private List<WKChannelMember> memberList = new ArrayList<>();
    private MemberAdapter memberAdapter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_group_members);
        
        setupRecyclerView();
        loadMembers();
    }
    
    private void loadMembers() {
        // Get all channel members
        List<WKChannelMember> members = WKIM.getInstance().getChannelMembersManager()
                .getMembers(channelId, channelType);
        
        if (members != null && !members.isEmpty()) {
            memberList.clear();
            memberList.addAll(members);
            memberAdapter.notifyDataSetChanged();
            
            updateMemberCount(members.size());
        } else {
            // No local data, may need to sync from server
            showEmptyState();
        }
    }
    
    private void getMemberInfo(String uid) {
        WKChannelMember member = WKIM.getInstance().getChannelMembersManager()
                .getMember(channelId, channelType, uid);
        
        if (member != null) {
            showMemberProfile(member);
        } else {
            showToast("Member information not found");
        }
    }
    
    private void updateMemberCount(int count) {
        setTitle("Group Members (" + count + ")");
    }
}

Search Members

// Search channel member list
WKIM.getInstance().getChannelMembersManager().getWithPageOrSearch(
    channelId, 
    channelType, 
    "keyword", 
    1,  // Page number
    20, // Items per page
    (list, isRemote) -> {
        // list: member list    
        // isRemote: whether data is from remote
        runOnUiThread(() -> {
            handleSearchResult(list, isRemote);
        });
    }
);

Search Functionality Example

public class MemberSearchActivity extends AppCompatActivity {
    
    private EditText searchEditText;
    private RecyclerView searchResultRecyclerView;
    private List<WKChannelMember> searchResults = new ArrayList<>();
    private MemberAdapter searchAdapter;
    
    private String channelId;
    private byte channelType;
    private int currentPage = 1;
    private boolean isLoading = false;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_member_search);
        
        setupViews();
        setupSearch();
    }
    
    private void setupSearch() {
        searchEditText.addTextChangedListener(new TextWatcher() {
            @Override
            public void afterTextChanged(Editable s) {
                String keyword = s.toString().trim();
                if (!TextUtils.isEmpty(keyword)) {
                    searchMembers(keyword);
                } else {
                    clearSearchResults();
                }
            }
            
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
            
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {}
        });
    }
    
    private void searchMembers(String keyword) {
        if (isLoading) return;
        
        isLoading = true;
        showLoadingIndicator();
        
        WKIM.getInstance().getChannelMembersManager().getWithPageOrSearch(
            channelId,
            channelType,
            keyword,
            1, // Start from first page for new search
            20,
            (list, isRemote) -> {
                runOnUiThread(() -> {
                    isLoading = false;
                    hideLoadingIndicator();
                    
                    if (list != null && !list.isEmpty()) {
                        searchResults.clear();
                        searchResults.addAll(list);
                        searchAdapter.notifyDataSetChanged();
                        showSearchResults();
                    } else {
                        showNoResultsState();
                    }
                });
            }
        );
    }
    
    private void loadMoreMembers(String keyword) {
        if (isLoading) return;
        
        isLoading = true;
        currentPage++;
        
        WKIM.getInstance().getChannelMembersManager().getWithPageOrSearch(
            channelId,
            channelType,
            keyword,
            currentPage,
            20,
            (list, isRemote) -> {
                runOnUiThread(() -> {
                    isLoading = false;
                    
                    if (list != null && !list.isEmpty()) {
                        int oldSize = searchResults.size();
                        searchResults.addAll(list);
                        searchAdapter.notifyItemRangeInserted(oldSize, list.size());
                    }
                });
            }
        );
    }
}

Common Operations

Save Channel Members

// Batch save members
WKIM.getInstance().getChannelMembersManager().save(List<WKChannelMember> list);

Update Member Remark

// Update remark
WKIM.getInstance().getChannelMembersManager().updateRemarkName(channelId, channelType, uid, remark);

Operations Example

public class MemberManagementHelper {
    
    // Batch add members
    public void addMembers(String channelId, byte channelType, List<WKChannelMember> newMembers) {
        // Save to local database
        WKIM.getInstance().getChannelMembersManager().save(newMembers);
        
        // Also call server API
        ApiManager.addChannelMembers(channelId, channelType, newMembers, 
            new ApiCallback<Void>() {
                @Override
                public void onSuccess(Void result) {
                    // Add successful, local data already saved
                    notifyMembersChanged();
                }
                
                @Override
                public void onError(int code, String message) {
                    // Add failed, may need to rollback local data
                    handleAddMembersError(code, message);
                }
            });
    }
    
    // Update member remark
    public void updateMemberRemark(String channelId, byte channelType, String uid, String newRemark) {
        // Update local remark
        WKIM.getInstance().getChannelMembersManager().updateRemarkName(channelId, channelType, uid, newRemark);
        
        // Sync to server
        ApiManager.updateMemberRemark(channelId, channelType, uid, newRemark,
            new ApiCallback<Void>() {
                @Override
                public void onSuccess(Void result) {
                    // Remark update successful
                    notifyMemberRemarkChanged(uid, newRemark);
                }
                
                @Override
                public void onError(int code, String message) {
                    // Update failed, restore original remark
                    WKChannelMember member = WKIM.getInstance().getChannelMembersManager()
                            .getMember(channelId, channelType, uid);
                    if (member != null) {
                        WKIM.getInstance().getChannelMembersManager()
                                .updateRemarkName(channelId, channelType, uid, member.memberRemark);
                    }
                }
            });
    }
    
    // Get online members
    public List<WKChannelMember> getOnlineMembers(String channelId, byte channelType) {
        List<WKChannelMember> allMembers = WKIM.getInstance().getChannelMembersManager()
                .getMembers(channelId, channelType);
        
        List<WKChannelMember> onlineMembers = new ArrayList<>();
        if (allMembers != null) {
            for (WKChannelMember member : allMembers) {
                if (member.status == 1) { // 1 means normal status
                    onlineMembers.add(member);
                }
            }
        }
        return onlineMembers;
    }
    
    // Get admin members
    public List<WKChannelMember> getAdminMembers(String channelId, byte channelType) {
        List<WKChannelMember> allMembers = WKIM.getInstance().getChannelMembersManager()
                .getMembers(channelId, channelType);
        
        List<WKChannelMember> adminMembers = new ArrayList<>();
        if (allMembers != null) {
            for (WKChannelMember member : allMembers) {
                if (member.role > 0) { // role > 0 means has admin privileges
                    adminMembers.add(member);
                }
            }
        }
        return adminMembers;
    }
}

WKChannelMember Data Structure

Member Properties

public class WKChannelMember {
    // Auto-increment ID
    public long id;
    
    // Channel ID
    public String channelID;
    
    // Channel type
    public byte channelType;
    
    // Member ID
    public String memberUID;
    
    // Member name
    public String memberName;
    
    // Member remark
    public String memberRemark;
    
    // Member avatar
    public String memberAvatar;
    
    // Member role
    public int role;
    
    // Member status (blacklist etc.) 1: normal 2: blacklist
    public int status;
    
    // Is deleted
    public int isDeleted;
    
    // Creation time
    public String createdAt;
    
    // Update time
    public String updatedAt;
    
    // Version
    public long version;
    
    // Robot 0: no 1: yes
    public int robot;
    
    // Extension fields
    public HashMap extraMap;
    
    // User remark
    public String remark;
    
    // Inviter UID
    public String memberInviteUID;
    
    // Forbidden expiration time
    public long forbiddenExpirationTime;
    
    public String memberAvatarCacheKey;
}

Property Description

PropertyTypeDescription
idlongAuto-increment ID
channelIDStringChannel ID
channelTypebyteChannel type
memberUIDStringMember user ID
memberNameStringMember name
memberRemarkStringMember remark
memberAvatarStringMember avatar URL
roleintMember role (0=regular member, >0=admin)
statusintMember status (1=normal, 2=blacklist)
isDeletedintIs deleted (0=normal, 1=deleted)
robotintIs robot (0=no, 1=yes)
remarkStringUser remark
memberInviteUIDStringInviter UID
forbiddenExpirationTimelongForbidden expiration timestamp

Next Steps