Need to implement channel member data source: Channel Member Data Source
Get Channel Members
Get All Members
Copy
// Get all members in a channel
WKIM.getInstance().getChannelMembersManager().getMembers(channelId, channelType);
Get Single Member
Copy
// Get single channel member
WKIM.getInstance().getChannelMembersManager().getMember(channelId, channelType, uid);
Complete Usage Example
Copy
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
Paginated Member Search
Copy
// 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
Copy
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
Copy
// Batch save members
WKIM.getInstance().getChannelMembersManager().save(List<WKChannelMember> list);
Update Member Remark
Copy
// Update remark
WKIM.getInstance().getChannelMembersManager().updateRemarkName(channelId, channelType, uid, remark);
Operations Example
Copy
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
Copy
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
| Property | Type | Description |
|---|---|---|
id | long | Auto-increment ID |
channelID | String | Channel ID |
channelType | byte | Channel type |
memberUID | String | Member user ID |
memberName | String | Member name |
memberRemark | String | Member remark |
memberAvatar | String | Member avatar URL |
role | int | Member role (0=regular member, >0=admin) |
status | int | Member status (1=normal, 2=blacklist) |
isDeleted | int | Is deleted (0=normal, 1=deleted) |
robot | int | Is robot (0=no, 1=yes) |
remark | String | User remark |
memberInviteUID | String | Inviter UID |
forbiddenExpirationTime | long | Forbidden expiration timestamp |

