package com.mogujie.tt.adapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import com.mogujie.tt.R; import com.mogujie.tt.imlib.IMSession; import com.mogujie.tt.imlib.proto.ContactEntity; import com.mogujie.tt.imlib.utils.DumpUtils; import com.mogujie.tt.imlib.utils.IMUIHelper; import com.mogujie.tt.log.Logger; import com.mogujie.widget.imageview.MGWebImageView; public class GroupManagerAdapter extends BaseAdapter { private Logger logger = Logger.getLogger(GroupManagerAdapter.class); private Context context = null; private boolean removeState = false;// 用于控制是否是删除状态 // key == contactId private List<ContactEntity> memberList = new ArrayList<ContactEntity>(); private Map<String, ContactEntity> originalMemberMap = new HashMap<String, ContactEntity>(); private boolean hasAddButton; private OnDeleteItemListener deleteItemListener; private Set<String> fixedIdSet; public interface OnDeleteItemListener { void onDeleteItem(String contactId); } public GroupManagerAdapter(Context c, boolean hasAddButton, OnDeleteItemListener deleteItemListner) { this.context = c; this.hasAddButton = hasAddButton; this.deleteItemListener = deleteItemListner; } public void setFixIdSet(Set<String> fixedIdSet) { this.fixedIdSet = fixedIdSet; } private boolean isFixId(String contactId) { if (fixedIdSet == null) { return false; } return fixedIdSet.contains(contactId); } public List<String> getMemberList() { List<String> memberList = new ArrayList<String>(); for (ContactEntity entity : this.memberList) { memberList.add(entity.id); } return memberList; } public void setData(List<ContactEntity> members) { logger.d("groupmgr#adapter setData size:%d", members.size()); for (ContactEntity contact : members) { if (contact == null) { return; } memberList.add(contact); originalMemberMap.put(contact.id, contact); } notifyDataSetChanged(); } public List<String> getAddingMemberList() { DumpUtils.dumpStringList(logger, "tempgroup#current member list", getMemberList()); DumpUtils.dumpStringList(logger, "tempgroup#original member list", new ArrayList<String>(originalMemberMap.keySet())); // todo eric any union, diff functions for set? List<String> addingList = new ArrayList<String>(); for (ContactEntity contact : memberList) { if (!originalMemberMap.containsKey(contact.id)) { logger.d("dialog#adding id:%s", contact.id); addingList.add(contact.id); } } return addingList; } public List<String> getRemovingMemberList() { // todo eric any union, diff functions for set? List<String> removingList = new ArrayList<String>(); for (String id : originalMemberMap.keySet()) { ContactEntity contact = originalMemberMap.get(id); if (!memberList.contains(contact)) { logger.d("dialog#removing id:%s", contact.id); removingList.add(contact.id); } } return removingList; } public boolean isInGroup(String contactId) { for (ContactEntity contact : memberList) { if (contact.id.equals(contactId)) { return true; } } return false; } public int getCount() { if (memberList != null) { int memberListSize = memberList.size(); if (hasAddButton) { // 1 means the "+" button return memberListSize + 1; } else { return memberListSize; } } return 0; } public Object getItem(int position) { return null; } public long getItemId(int position) { return position; } public void remove(int position) { ContactEntity contact = memberList.get(position); if (contact == null) { return; } removeByIdImpl(contact.id); this.notifyDataSetChanged(); } public void removeById(String contactId) { removeByIdImpl(contactId); this.notifyDataSetChanged(); } public void removeByIdImpl(String contactId) { for (ContactEntity contact : memberList) { if (contact.id.equals(contactId)) { memberList.remove(contact); return; } } } public void add(ContactEntity contact) { setRemoveState(false); memberList.add(contact); notifyDataSetChanged(); } public View getView(int position, View convertView, ViewGroup parent) { logger.d("debug#getView position:%d, member size:%d", position, memberList.size()); GroupHolder holder = null; if (convertView == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.tt_group_manage_grid_item, null); holder = new GroupHolder(); holder.imageView = (MGWebImageView) convertView.findViewById(R.id.grid_item_image); holder.userTitle = (TextView) convertView.findViewById(R.id.group_manager_user_title); holder.deleteImg = convertView.findViewById(R.id.deleteLayout); convertView.setTag(holder); } else { holder = (GroupHolder) convertView.getTag(); } if (position >= 0 && memberList.size() > position) { logger.d("groupmgr#in mebers area"); ContactEntity contactEntity = memberList.get(position); logger.d("debug#add contact name:%s", contactEntity.name); setHolder(holder, position, contactEntity.avatarUrl, 0, contactEntity.name, contactEntity); } else if (position >= memberList.size() && hasAddButton) { logger.d("groupmgr#add + button"); setHolder(holder, position, null, R.drawable.tt_group_manager_add_user, "", null); } return convertView; } private void setHolder(final GroupHolder holder, int position, String avatarUrl, int avatarResourceId, String name, ContactEntity contactEntity) { logger.d("debug#setHolder position:%d", position); if (null != holder) { // holder.imageView.setAdjustViewBounds(false); // holder.imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); if (avatarUrl != null) { IMUIHelper.setWebImageViewAvatar(holder.imageView, avatarUrl, IMSession.SESSION_P2P); } else { logger.d("groupmgr#setimageresid %d", avatarResourceId); holder.imageView.setImageResource(avatarResourceId); } holder.contactEntity = contactEntity; if (contactEntity != null) { logger.d("debug#setHolderContact name:%s", contactEntity.name); holder.deleteImg.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { logger.d("debug#name:%s", holder.contactEntity.name); GroupManagerAdapter.this.removeById(holder.contactEntity.id); if (deleteItemListener != null) { deleteItemListener.onDeleteItem(holder.contactEntity.id); } } }); } holder.userTitle.setText(name); holder.imageView.setVisibility(View.VISIBLE); holder.userTitle.setVisibility(View.VISIBLE); if (shouldShowDeleteStatus(contactEntity)) { holder.deleteImg.setVisibility(View.VISIBLE); if (avatarResourceId == R.drawable.tt_group_manager_add_user) { holder.imageView.setVisibility(View.INVISIBLE); holder.userTitle.setVisibility(View.INVISIBLE); holder.deleteImg.setVisibility(View.INVISIBLE); } } else { holder.deleteImg.setVisibility(View.INVISIBLE); } } } private boolean shouldShowDeleteStatus(ContactEntity contact){ if (!removeState) { return false; } if (contact == null) { return false; } if (isFixId(contact.id)) { return false; } return true; } final class GroupHolder { MGWebImageView imageView; TextView userTitle; View deleteImg; ContactEntity contactEntity; } public void setRemoveState(boolean remove) { removeState = remove; } public boolean getRemoveState() { return removeState; } public boolean isAddMemberButton(int position) { return (position == memberList.size()); } }