package com.fanxin.app.fx.others; import java.util.ArrayList; import java.util.List; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; 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.fanxin.app.Constant; import com.fanxin.app.R; import com.fanxin.app.domain.User; import com.fanxin.app.fx.others.LoadUserAvatar.ImageDownloadedCallBack; /** * 简单的好友Adapter实现 * */ public class ContactAdapter extends ArrayAdapter<User> implements SectionIndexer { List<String> list; List<User> userList; List<User> copyUserList; private LayoutInflater layoutInflater; private SparseIntArray positionOfSection; private SparseIntArray sectionOfPosition; private int res; public MyFilter myFilter; private LoadUserAvatar avatarLoader; @SuppressLint("SdCardPath") 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); avatarLoader = new LoadUserAvatar(context, "/sdcard/fanxin/"); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = layoutInflater.inflate(res, null); } ImageView iv_avatar = (ImageView) convertView .findViewById(R.id.iv_avatar); TextView nameTextview = (TextView) convertView .findViewById(R.id.tv_name); TextView tvHeader = (TextView) convertView.findViewById(R.id.header); View view_temp = (View) convertView.findViewById(R.id.view_temp); User user = getItem(position); if (user == null) Log.d("ContactAdapter", position + ""); // 设置nick,demo里不涉及到完整user,用username代替nick显示 String header = user.getHeader(); String usernick = user.getNick(); String useravatar = user.getAvatar(); if (position == 0 || header != null && !header.equals(getItem(position - 1).getHeader())) { if ("".equals(header)) { tvHeader.setVisibility(View.GONE); view_temp.setVisibility(View.VISIBLE); } else { tvHeader.setVisibility(View.VISIBLE); tvHeader.setText(header); view_temp.setVisibility(View.GONE); } } else { tvHeader.setVisibility(View.GONE); view_temp.setVisibility(View.VISIBLE); } // 显示申请与通知item nameTextview.setText(usernick); iv_avatar.setImageResource(R.drawable.default_useravatar); showUserAvatar(iv_avatar, useravatar); 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(); System.err.println("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> mList = null; public MyFilter(List<User> myList) { super(); this.mList = myList; } @Override protected synchronized FilterResults performFiltering( CharSequence prefix) { FilterResults results = new FilterResults(); if (mList == null) { mList = new ArrayList<User>(); } if (prefix == null || prefix.length() == 0) { results.values = copyUserList; results.count = copyUserList.size(); } else { String prefixString = prefix.toString(); final int count = mList.size(); final ArrayList<User> newValues = new ArrayList<User>(); for (int i = 0; i < count; i++) { final User user = mList.get(i); String username = user.getUsername(); EMConversation conversation = EMChatManager.getInstance() .getConversation(username); if (conversation != null) { username = conversation.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(); } return results; } @SuppressWarnings("unchecked") @Override protected synchronized void publishResults(CharSequence constraint, FilterResults results) { userList.clear(); userList.addAll((List<User>) results.values); if (results.count > 0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } } } private void showUserAvatar(ImageView iamgeView, String avatar) { if(avatar==null||avatar.equals("")) return; final String url_avatar = Constant.URL_Avatar + avatar; iamgeView.setTag(url_avatar); if (url_avatar != null && !url_avatar.equals("")) { Bitmap bitmap = avatarLoader.loadImage(iamgeView, url_avatar, new ImageDownloadedCallBack() { @Override public void onImageDownloaded(ImageView imageView, Bitmap bitmap) { if (imageView.getTag() == url_avatar) { imageView.setImageBitmap(bitmap); } } }); if (bitmap != null) iamgeView.setImageBitmap(bitmap); } } }