/** * Copyright (C) 2013-2014 EaseMob Technologies. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.easemob.chatuidemo.adapter; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.text.TextUtils; import android.util.Log; import android.util.SparseIntArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Filter; import android.widget.ImageView; import android.widget.SectionIndexer; import android.widget.TextView; import com.easemob.chat.EMChatManager; import com.easemob.chat.EMConversation; import com.easemob.chatuidemo.Constant; import com.sxit.dreamiya.R; import com.easemob.chatuidemo.domain.User; import com.easemob.chatuidemo.utils.UserUtils; import com.easemob.chatuidemo.widget.Sidebar; import com.easemob.util.EMLog; /** * 简单的好友Adapter实现 * */ public class ContactAdapter extends ArrayAdapter<User> implements SectionIndexer{ private static final String TAG = "ContactAdapter"; List<String> list; List<User> userList; List<User> copyUserList; private LayoutInflater layoutInflater; private SparseIntArray positionOfSection; private SparseIntArray sectionOfPosition; private int res; private MyFilter myFilter; private boolean notiyfyByFilter; public ContactAdapter(Context context, int resource, List<User> objects) { super(context, resource, objects); this.res = resource; this.userList = objects; copyUserList = new ArrayList<User>(); copyUserList.addAll(objects); layoutInflater = LayoutInflater.from(context); } private static class ViewHolder { ImageView avatar; TextView unreadMsgView; TextView nameTextview; TextView tvHeader; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView == null){ holder = new ViewHolder(); convertView = layoutInflater.inflate(res, null); holder.avatar = (ImageView) convertView.findViewById(R.id.avatar); holder.unreadMsgView = (TextView) convertView.findViewById(R.id.unread_msg_number); holder.nameTextview = (TextView) convertView.findViewById(R.id.name); holder.tvHeader = (TextView) convertView.findViewById(R.id.header); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } User user = getItem(position); if(user == null) Log.d("ContactAdapter", position + ""); //设置nick,demo里不涉及到完整user,用username代替nick显示 String username = user.getUsername(); String header = user.getHeader(); if (position == 0 || header != null && !header.equals(getItem(position - 1).getHeader())) { if (TextUtils.isEmpty(header)) { holder.tvHeader.setVisibility(View.GONE); } else { holder.tvHeader.setVisibility(View.VISIBLE); holder.tvHeader.setText(header); } } else { holder.tvHeader.setVisibility(View.GONE); } //显示申请与通知item if(username.equals(Constant.NEW_FRIENDS_USERNAME)){ holder.nameTextview.setText(user.getNick()); holder.avatar.setImageResource(R.drawable.new_friends_icon); if(user.getUnreadMsgCount() > 0){ holder.unreadMsgView.setVisibility(View.VISIBLE); // holder.unreadMsgView.setText(user.getUnreadMsgCount()+""); }else{ holder.unreadMsgView.setVisibility(View.INVISIBLE); } }else if(username.equals(Constant.GROUP_USERNAME)){ //群聊item holder.nameTextview.setText(user.getNick()); holder.avatar.setImageResource(R.drawable.groups_icon); }else if(username.equals(Constant.CHAT_ROOM)){ //群聊item holder.nameTextview.setText(user.getNick()); holder.avatar.setImageResource(R.drawable.groups_icon); }else if(username.equals(Constant.CHAT_ROBOT)){ //Robot item holder.nameTextview.setText(user.getNick()); holder.avatar.setImageResource(R.drawable.groups_icon); }else{ holder.nameTextview.setText(username); //设置用户头像 UserUtils.setUserAvatar(getContext(), username, holder.avatar); if(holder.unreadMsgView != null) holder.unreadMsgView.setVisibility(View.INVISIBLE); } return convertView; } @Override public User getItem(int position) { return super.getItem(position); } @Override public int getCount() { return super.getCount(); } public int getPositionForSection(int section) { return positionOfSection.get(section); } public int getSectionForPosition(int position) { return sectionOfPosition.get(position); } @Override public Object[] getSections() { positionOfSection = new SparseIntArray(); sectionOfPosition = new SparseIntArray(); int count = getCount(); list = new ArrayList<String>(); list.add(getContext().getString(R.string.search_header)); positionOfSection.put(0, 0); sectionOfPosition.put(0, 0); for (int i = 1; i < count; i++) { String letter = getItem(i).getHeader(); EMLog.d(TAG, "contactadapter getsection getHeader:" + letter + " name:" + getItem(i).getUsername()); int section = list.size() - 1; if (list.get(section) != null && !list.get(section).equals(letter)) { list.add(letter); section++; positionOfSection.put(section, i); } sectionOfPosition.put(i, section); } return list.toArray(new String[list.size()]); } @Override public Filter getFilter() { if(myFilter==null){ myFilter = new MyFilter(userList); } return myFilter; } private class MyFilter extends Filter{ List<User> mOriginalList = null; public MyFilter(List<User> myList) { this.mOriginalList = myList; } @Override protected synchronized FilterResults performFiltering(CharSequence prefix) { FilterResults results = new FilterResults(); if(mOriginalList==null){ mOriginalList = new ArrayList<User>(); } EMLog.d(TAG, "contacts original size: " + mOriginalList.size()); EMLog.d(TAG, "contacts copy size: " + copyUserList.size()); if(prefix==null || prefix.length()==0){ results.values = copyUserList; results.count = copyUserList.size(); }else{ String prefixString = prefix.toString(); final int count = mOriginalList.size(); final ArrayList<User> newValues = new ArrayList<User>(); for(int i=0;i<count;i++){ final User user = mOriginalList.get(i); String username = user.getUsername(); if(username.startsWith(prefixString)){ newValues.add(user); } 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(user); break; } } } } results.values=newValues; results.count=newValues.size(); } EMLog.d(TAG, "contacts filter results size: " + results.count); return results; } @Override protected synchronized void publishResults(CharSequence constraint, FilterResults results) { userList.clear(); userList.addAll((List<User>)results.values); EMLog.d(TAG, "publish contacts filter results size: " + results.count); if (results.count > 0) { notiyfyByFilter = true; notifyDataSetChanged(); notiyfyByFilter = false; } else { notifyDataSetInvalidated(); } } } @Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); if(!notiyfyByFilter){ copyUserList.clear(); copyUserList.addAll(userList); } } }