注册

android开发查找聊天记录功能

由于环信本生没有开放出查找聊天记录的接口,但是需求要实现该功能,只能用其他方式实习。
 
实现聊天功能需要用到EventBus
 
EventBus的作用的是回来传值,因为本生的Intent传值,接受不了太多的数据。
 
1.当在聊天页面的时候,去2级页面,获取当前聊天的总数。

2.开启一个异步线程,new EMConversation 类,然后清空

3.在拿聊天页面的当前会话类mConversation .loadMoreMsgFromDB("", 5000) 一次拉取5000条数据出来
通过EventBug 发送出去(发送EventBug的时候不能用post,而且是用postSticky),通过bug应该知道,不知道的百度下。

4.clear  new 出的新会话类

5.在用当前聊天页面的会话类mConversation.loadMoreMsgFromDB("", mMsgCount); 获取本生显示的消息数据
然后在
mConversation.getAllMessages()
这样做的目的,主要是避免内存中出现重复的数据。
 
数据已经筛选出来了,现在开始模糊查询,跳到2级页面的时候,此时因为有EventBus收到的聊天消息,通过关键字段,来模糊出当前消息,附件有配图,匹配出来后,显示聊天的适配器中,附件有配图,后面下啦的,也会拉出最新的数据附件有配图 ,模糊查询和下拉更多,就是相关逻辑了,不多说直接贴代码。
 
1.通过关键字获取当前聊天记录的数据
EMMessage m = mSearchData.get(position); 
String msgId = m.getMsgId(); mIndex = 0;
/** * 获取当前所有数据的索引 */
mTempDatas.clear(); mTempDatas.addAll(mDatas);

for (int i = 0; i < mTempDatas.size(); i++) {
if (msgId.equals(mTempDatas.get(i).getMsgId())) {
mIndex = i;
break;
}
}

/** * 获取匹配到的数据并且获得最新的10条数据 */

for (int j = mIndex; j < mTempDatas.size(); j++) {
if (j == 10) {
break;
}
messages.add(mTempDatas.get(j));
}

mTempDatas.removeAll(messages);
Collections.reverse(mTempDatas);
mChatAdapter.notifyDataSetChanged();
vList_emm.setVisibility(View.GONE);
vHint.setVisibility(View.GONE);
findViewById(R.id.rela_edit).setVisibility(View.GONE); findViewById(R.id.btn_view).setVisibility(View.GONE);
listView.setSelection(0);

 
2.下拉更多
if (mTempDatas.size() == 0) {
IShowToast("已经加载完成");
}else
{

List<EMMessage> temps = new ArrayList<EMMessage>();
temps.addAll(messages);
messages.clear()
for (int i = 0; i < mTempDatas.size(); i++) {
messages.add(mTempDatas.get(i));
if (i == 10) {
break;
}
}

int index = 0;
index = messages.size();
Collections.reverse(messages);
mTempDatas.removeAll(messages);
messages.addAll(temps);
mChatAdapter.notifyDataSetChanged();
listView.setSelection(index);

}

 
 
大致这些了,这个代码排版好麻烦。。。为了方便看,只能一排排的粘贴
 
后期有空,会在教大家如何优化聊天适配器,如何快速扩展,使代码更加清晰。
 
 
 

2 个评论

写的很不错,赞一个。在编写文章的时候有一个code选项,可以直接贴代码的,我简单修改了下样式。
有的地方不是太明白 有比较完整的代码吗

要回复文章请先登录注册