现在所受的苦难,总有一天会笑着讲出来。

在介绍会话界面的时候忘记了一部分内容,关于会话列表的显示。ChatAllHistoryAdapter。

public class ChatAllHistoryAdapter extends ArrayAdapter<EMConversation> {private LayoutInflater inflater;private List<EMConversation> conversationList;private List<EMConversation> copyConversationList;private ConversationFilter conversationFilter;private boolean notiyfyByFilter;public ChatAllHistoryAdapter(Context context, int textViewResourceId, List<EMConversation> objects) {super(context, textViewResourceId, objects);this.conversationList = objects;copyConversationList = new ArrayList<EMConversation>();copyConversationList.addAll(objects);inflater = LayoutInflater.from(context);}这个Adapter继承自ArrayAdapter,在构造方法中赋值数据。    private static class ViewHolder {        /** 和谁的聊天记录 */        TextView name;        /** 消息未读数 */        TextView unreadLabel;        /** 最后一条消息的内容 */        TextView message;        /** 最后一条消息的时间 */        TextView time;        /** 用户头像 */        ImageView avatar;        /** 最后一条消息的发送状态 */        View msgState;        /** 整个list中每一行总布局 */        RelativeLayout list_item_layout;    }@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = inflater.inflate(R.layout.row_chat_history, parent, false);}ViewHolder holder = (ViewHolder) convertView.getTag();if (holder == null) {holder = new ViewHolder();holder.name = (TextView) convertView.findViewById(R.id.name);holder.unreadLabel = (TextView) convertView.findViewById(R.id.unread_msg_number);holder.message = (TextView) convertView.findViewById(R.id.message);holder.time = (TextView) convertView.findViewById(R.id.time);holder.avatar = (ImageView) convertView.findViewById(R.id.avatar);holder.msgState = convertView.findViewById(R.id.msg_state);holder.list_item_layout = (RelativeLayout) convertView.findViewById(R.id.list_item_layout);convertView.setTag(holder);}if (position % 2 == 0) {holder.list_item_layout.setBackgroundResource(R.drawable.mm_listitem);} else {holder.list_item_layout.setBackgroundResource(R.drawable.mm_listitem_grey);}// 获取与此用户/群组的会话EMConversation conversation = getItem(position);// 获取用户username或者群组groupidString username = conversation.getUserName();List<EMGroup> groups = EMGroupManager.getInstance().getAllGroups();EMContact contact = null;boolean isGroup = false;for (EMGroup group : groups) {if (group.getGroupId().equals(username)) {isGroup = true;contact = group;break;}}if (isGroup) {// 群聊消息,显示群聊头像holder.avatar.setImageResource(R.drawable.group_icon);holder.name.setText(contact.getNick() != null ? contact.getNick() : username);} else {UserUtils.setUserAvatar(getContext(), username, holder.avatar);if (username.equals(Constant.GROUP_USERNAME)) {holder.name.setText("群聊");} else if (username.equals(Constant.NEW_FRIENDS_USERNAME)) {holder.name.setText("申请与通知");}holder.name.setText(username);}if (conversation.getUnreadMsgCount() > 0) {// 显示与此用户的消息未读数holder.unreadLabel.setText(String.valueOf(conversation.getUnreadMsgCount()));holder.unreadLabel.setVisibility(View.VISIBLE);} else {holder.unreadLabel.setVisibility(View.INVISIBLE);}if (conversation.getMsgCount() != 0) {// 把最后一条消息的内容作为item的message内容EMMessage lastMessage = conversation.getLastMessage();holder.message.setText(SmileUtils.getSmiledText(getContext(), getMessageDigest(lastMessage, (this.getContext()))), BufferType.SPANNABLE);holder.time.setText(DateUtils.getTimestampString(new Date(lastMessage.getMsgTime())));if (lastMessage.direct == EMMessage.Direct.SEND && lastMessage.status == EMMessage.Status.FAIL) {holder.msgState.setVisibility(View.VISIBLE);} else {holder.msgState.setVisibility(View.GONE);}}return convertView;}在getVIew中对ITEM进行设置,,首先对POSATION的奇偶设置不通的背景。在设置头像的时候用到了第三方库Picasso。/*** 设置用户头像* @param username*/public static void setUserAvatar(Context context, String username, ImageView imageView){User user = getUserInfo(username);if(user != null){Picasso.with(context).load(user.getAvatar()).placeholder(R.drawable.default_avatar).into(imageView);}else{Picasso.with(context).load(R.drawable.default_avatar).into(imageView);}}并且对用户,群组,申请和通知区分开来,以及显示未读消息数。并且取出最后一条消息作为body显示在ITEM中。也会判断消息类型。/** * 根据消息内容和消息类型获取消息内容提示 * * @param message * @param context * @return */private String getMessageDigest(EMMessage message, Context context) {String digest = "";switch (message.getType()) {case LOCATION: // 位置消息if (message.direct == EMMessage.Direct.RECEIVE) {// 从sdk中提到了ui中,使用更简单不犯错的获取string的方法// digest = EasyUtils.getAppResourceString(context,// "location_recv");digest = getStrng(context, R.string.location_recv);digest = String.format(digest, message.getFrom());return digest;} else {// digest = EasyUtils.getAppResourceString(context,// "location_prefix");digest = getStrng(context, R.string.location_prefix);}break;case IMAGE: // 图片消息ImageMessageBody imageBody = (ImageMessageBody) message.getBody();digest = getStrng(context, R.string.picture) + imageBody.getFileName();break;case VOICE:// 语音消息digest = getStrng(context, R.string.voice);break;case VIDEO: // 视频消息digest = getStrng(context, R.string.video);break;case TXT: // 文本消息if (!message.getBooleanAttribute(Constant.MESSAGE_ATTR_IS_VOICE_CALL, false)) {TextMessageBody txtBody = (TextMessageBody) message.getBody();digest = txtBody.getMessage();} else {TextMessageBody txtBody = (TextMessageBody) message.getBody();digest = getStrng(context, R.string.voice_call) + txtBody.getMessage();}break;case FILE: // 普通文件消息digest = getStrng(context, R.string.file);break;default:System.err.println("error, unknow type");return "";}return digest;}其中有一点需要注意,在实现的方法中需要重写@Overridepublic Filter getFilter() {if (conversationFilter == null) {conversationFilter = new ConversationFilter(conversationList);}return conversationFilter;}private class ConversationFilter extends Filter {List<EMConversation> mOriginalValues = null;public ConversationFilter(List<EMConversation> mList) {mOriginalValues = mList;}@Overrideprotected FilterResults performFiltering(CharSequence prefix) {FilterResults results = new FilterResults();if (mOriginalValues == null) {mOriginalValues = new ArrayList<EMConversation>();}if (prefix == null || prefix.length() == 0) {results.values = copyConversationList;results.count = copyConversationList.size();} else {String prefixString = prefix.toString();final int count = mOriginalValues.size();final ArrayList<EMConversation> newValues = new ArrayList<EMConversation>();for (int i = 0; i < count; i++) {final EMConversation value = mOriginalValues.get(i);String username = value.getUserName();EMGroup group = EMGroupManager.getInstance().getGroup(username);if (group != null) {username = group.getGroupName();}// First match against the whole ,non-splitted valueif (username.startsWith(prefixString)) {newValues.add(value);} else {final String[] words = username.split(" ");final int wordCount = words.length;// Start at index 0, in case valueText starts with// space(s)for (int k = 0; k < wordCount; k++) {if (words[k].startsWith(prefixString)) {newValues.add(value);break;}}}}results.values = newValues;results.count = newValues.size();}return results;}@Overrideprotected void publishResults(CharSequence constraint, FilterResults results) {conversationList.clear();conversationList.addAll((List<EMConversation>) results.values);if (results.count > 0) {notiyfyByFilter = true;notifyDataSetChanged();} else {notifyDataSetInvalidated();}}}用来实现查询功能。@Overridepublic void notifyDataSetChanged() {super.notifyDataSetChanged();if (!notiyfyByFilter) {copyConversationList.clear();copyConversationList.addAll(conversationList);notiyfyByFilter = false;}}最后完成数据的更新方法。

唯有讲述此间途经的美景,分享没有男主角的相片。

现在所受的苦难,总有一天会笑着讲出来。

相关文章:

你感兴趣的文章:

标签云: