版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
网易云信最近联系人中加入本地服务端数据
1.实现效果如下(语音聊天中)
2.实现思路:
特定情况下:
1、获取聊天列表(最近联系人中id)
2、根据id,请求所有人的情况
3、刷新列表
3.具体实现:
1.获取用户id
items_id.clear();
for (int i = 0; i < items_adapter.size(); i++) {
//此处,避免最近联系人过多。我们只刷新前三十个人。
if (i >= 30) {
break;
}
items_id.add(items_adapter.get(i).getContactId());
}
2.请求
犹豫数据渲染在网易云信module中,不能进行网络请求。所以将id通过回调传到app模块中,请求完成后。再传回来。
1、回调
if (callBackUnreadNum != null) {
try {
callBackUnreadNum.sendList(items_id);
} catch (Exception e) {
e.printStackTrace();
}
}
2、请求
@Override
public void sendList(List<String> list) {
//5秒内,不允许重复刷新
if (ClickUtils.isInterval(5000)) {
return;
}
String str_params = LXUtils.getStringParamsString(list);
org.json.JSONObject params = new org.json.JSONObject();
try {
params.put("accids", str_params);
} catch (JSONException e) {
e.printStackTrace();
}
LxRequest.getInstance().request(getContext(), CHAT_ROOM_USER_STATUS, params, handler, 3, false, "");
}
3、传回去
if (object_temp3.getInteger("status") == 0) {
JSONArray list = object_temp3.getJSONArray("data");
recentContactsFragment.refreshChatroom(list);
}
3.刷新列表:
(1).将数据赋值给原先列表:(recentContact.setExtension(map);)
//请求的数据(用户的状态)
for (int i = 0; i < list.size(); i++) {
JSONObject jsonObject = list.getJSONObject(i);
String accid = jsonObject.getString("accid");
//聊天最近联系人
for (int j = 0; j < items_adapter.size(); j++) {
RecentContact recentContact = items_adapter.get(j);
String contactId = recentContact.getContactId();
if (contactId.equals(accid)) {
Map<String, Object> map = new HashMap<>();
map.put("room_id", jsonObject.getInteger("room_id"));
recentContact.setExtension(map);
}
}
(2)RecentViewHolder中进行数据展示
if (extensionMap != null) {
try {
room_id =(int) extensionMap.get("room_id");
} catch (Exception e) {
e.printStackTrace();
}
if (room_id == 0) {
tvVoiceChat.setVisibility(View.GONE);
tvDatetime.setVisibility(View.VISIBLE);
} else {
tvVoiceChat.setVisibility(View.VISIBLE);
tvDatetime.setVisibility(View.GONE);
}
} else {
tvVoiceChat.setVisibility(View.GONE);
tvDatetime.setVisibility(View.VISIBLE);
}
(3)点击后。将数据回传到FragmentMessage,进行进入房间操作
tvVoiceChat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (getCallback() != null) {
getCallback().onRoomInfo(finalRoom_id + "");
}
}
});
4.刷新时机:
1、左右切换tab
2、下拉刷新
3、聊天列表自动刷新(信息发生改变),列表数量发生改变(减少可不刷新)
4、当用户状态发生改变时候,可以通过socket进行刷新
5.思考点:
1、刷新时机
2、避免左右切换,频繁刷新(5秒内不允许重复刷新)
3、网络请求,传值请求,再回传。
4、进入房间,将事件回传