package com.roboo.like.google.adapters; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; import android.app.Activity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckedTextView; import android.widget.ImageView; import android.widget.SectionIndexer; import android.widget.TextView; import com.roboo.like.google.R; import com.roboo.like.google.models.ContacterItem; import com.roboo.like.google.utils.PinYinUtils; public class ContacterAdapter extends BaseAdapter implements StickyHeadersAdapter, SectionIndexer { private LinkedList<ContacterItem> mData; private Activity mActivity; private LayoutInflater mInflater; /** 用于记录两个字符串大写首字母不相同时,该比较字符串所在List集合的索引位置 */ private LinkedList<Integer> mSectionIndex = new LinkedList<Integer>(); public ContacterAdapter(Activity activity, LinkedList<ContacterItem> data) { mActivity = activity; mInflater = LayoutInflater.from(mActivity); mData = generateHeaderId(data); } public int getCount() { return null == mData ? 0 : mData.size(); } @Override public Object getItem(int position) { return null == mData ? null : mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null) { convertView = LayoutInflater.from(mActivity).inflate(R.layout.contacter_list_item, null); } final CheckedTextView textView = (CheckedTextView) convertView.findViewById(R.id.ctv_text); ImageView imageView = (ImageView) convertView.findViewById(R.id.iv_image); ContacterItem item = mData.get(position); if (item.bitmap != null) { imageView.setImageBitmap(item.bitmap); } textView.setText(item.name + "[ " + item.phone + " ]"); textView.setOnClickListener(new OnClickListener() { public void onClick(View v) { textView.setChecked(!textView.isChecked()); } }); return convertView; } @Override public Object[] getSections() { String[] sections = new String[mSectionIndex.size()]; for (int i = 0; i < mSectionIndex.size(); i++) { sections[i] = getFristLetter(mData.get(mSectionIndex.get(i)).name); } return sections; } @Override public int getPositionForSection(int section) { if (section >= mSectionIndex.size()) { section = mSectionIndex.size() - 1; } else if (section < 0) { section = 0; } return mSectionIndex.get(section); } @Override public int getSectionForPosition(int position) { for (int i = 0; i < mSectionIndex.size(); i++) { if (position < mSectionIndex.get(i)) { return i - 1; } } return mSectionIndex.size() - 1; } @Override public long getHeaderId(int position) { return mData.get(position).headerId; } @Override public View getHeaderView(int position, View convertView, ViewGroup parent) { convertView = mInflater.inflate(R.layout.sticky_header_view, parent, false); TextView textView = (TextView) convertView.findViewById(R.id.tv_text); textView.setText(getFristLetter(mData.get(position).name)); return convertView; } private LinkedList<ContacterItem> generateHeaderId(LinkedList<ContacterItem> data) { Map<String, Integer> mHeaderIdMap = new HashMap<String, Integer>(); int mHeaderId = 1; LinkedList<ContacterItem> hasHeaderIdList = new LinkedList<ContacterItem>(); for (int i = 0; i < data.size(); i++) { ContacterItem item = data.get(i); // 按照首字母进行生成HeaderId String firstLetter = getFristLetter(item.name); if (!mHeaderIdMap.containsKey(firstLetter)) { item.headerId = mHeaderId; mHeaderIdMap.put(firstLetter, mHeaderId); mHeaderId++; mSectionIndex.add(i); } else { item.headerId = mHeaderIdMap.get(firstLetter); } hasHeaderIdList.add(item); } return hasHeaderIdList; } /** 获取中文字符串的大写首字母 */ private String getFristLetter(String str) { HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE); defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); return PinYinUtils.getPinYinHeadChar(str, defaultFormat).substring(0, 1); } }