package com.sogouchat.ui; import java.security.PublicKey; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import com.sogouchat.R; import com.sogouchat.SogouChatApp; import com.sogouchat.bean.ContactNode; import com.sogouchat.bean.DownNode; import com.sogouchat.bean.MsgNode; import com.sogouchat.bean.TelNode; import com.sogouchat.os.ChatAppConstant; import com.sogouchat.ui.ChatMsgViewAdapter.IMsgContentType; import com.sogouchat.ui.ContactListAdapter.SortByPinyin; import android.R.integer; import android.app.Activity; import android.app.ListActivity; import android.content.ContentProviderOperation; import android.content.ContentUris; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.database.DataSetObserver; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.os.SystemClock; import android.provider.ContactsContract; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.RawContacts; import android.text.Editable; import android.text.Spannable; import android.text.TextWatcher; import android.text.format.Time; import android.text.style.TextAppearanceSpan; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnCreateContextMenuListener; import android.view.animation.TranslateAnimation; import android.view.ViewGroup; import android.view.Window; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.Adapter; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; public class ContactListActivity2 extends Activity { public final class ViewHolder { public TextView mIcon; public TextView mName; public TextView mTel; } private static final String TAG = "ContactListActivity2"; public ArrayList<TelNode> mData = new ArrayList<TelNode>(); private LayoutInflater mInflater; private View mCustomItem; SogouChatApp mApp; public int[] mAlphaIndex = new int[27]; private AllContactsAdapter mAdapter; private ListView mListView; private ImageView mQuickSearchBar; private ImageView mQuickSearchThumb; private ImageView mQuickSearchIcon; private LinearLayout mQuickTip; private TextView mTipText; private Button mBtnOften;// 常用联系人button private Button mBtnAll;// 全部联系人button private Button mBtnContactInvite;// 邀请联系人button private String[] oftencontacts = new String[] { "夏侯惇", "甄姬", "许褚", "马超", "张飞", "刘备", "刘宇" }; private String[] oftencontactstel = new String[] { "13641030111", "13641030112", "119", "13641030113", "13641030114", "110", "13641030115" }; private EditText searchEditText; private boolean mIsSearch = false;// 是否处于搜索状态 private String msearchContent = null; private int splitNum = 0; private int longClickIndex = 0;// 全部联系人长按索引值 private int mAllListScrollState; private int mOftenListVisible = 0;// 0是可见,1是不可见 protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.contacts_list2); mIsSearch = false; mInflater = LayoutInflater.from(this); mApp = (SogouChatApp) getApplication(); mApp.mContactsList = this; searchEditText = (EditText) findViewById(R.id.myet1); mBtnOften = (Button) findViewById(R.id.buttonOften); if (mApp.mTelList == null) { Log.i("onCreate setupOftenContactsData ", "err:mTelList == null"); if (mApp.mMsgList == null) Log.i("onCreate setupOftenContactsData ", "err:mMsgList == null"); return; } mApp.setupOftenContactsData(); if (mApp.mOftenContacts == null) mBtnOften.setText("常用联系人(0)"); else mBtnOften.setText("常用联系人(" + mApp.mOftenContacts.size() + ")"); mBtnOften.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { RelativeLayout layoutOftenLayout = (RelativeLayout) findViewById(R.id.contacts_layout4); RelativeLayout lineBelowOftenLayout = (RelativeLayout) findViewById(R.id.contacts_layoutline2); int i = 1; i = layoutOftenLayout.getVisibility(); if (i == 0)// 可见的改为不可见 { layoutOftenLayout.setVisibility(8); lineBelowOftenLayout.setVisibility(8); } else { layoutOftenLayout.setVisibility(0); lineBelowOftenLayout.setVisibility(0); GridView gridview = (GridView) findViewById(R.id.gridview); int gridHeight = gridview.getLayoutParams().height; ViewGroup.LayoutParams temParams = layoutOftenLayout .getLayoutParams(); temParams.height = gridHeight; layoutOftenLayout.setLayoutParams(temParams); } } }); // 常用联系人适配器 GridView gridview = (GridView) findViewById(R.id.gridview); if (mApp.mOftenContacts != null) { // 生成动态数组,并且转入数据 ArrayList<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>(); for (int i = 0; i < mApp.mOftenContacts.size(); i++) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("ItemText", mApp.mOftenContacts.get(i).mName);// 按序号做ItemText lstImageItem.add(map); } // 生成适配器的ImageItem <====> 动态数组的元素,两者一一对应 SimpleAdapter OftenContactsAdapter = new SimpleAdapter(this, // 没什么解释 lstImageItem,// 数据来源 R.layout.often_contacts_grid,// night_item的XML实现 // 动态数组与ImageItem对应的子项 new String[] { "ItemText" }, // ImageItem的XML文件里面的一个ImageView,两个TextView ID new int[] { R.id.ItemText }); // 添加并且显示 gridview.setAdapter(OftenContactsAdapter); // 添加消息处理 gridview.setOnItemClickListener(new ItemClickListener()); } mBtnAll = (Button) findViewById(R.id.buttonAll); setupAllContactsView(); RelativeLayout layoutOftenLayout = (RelativeLayout) findViewById(R.id.contacts_layout4); int tempval = gridview.getLayoutParams().height; ViewGroup.LayoutParams temparams = layoutOftenLayout.getLayoutParams(); temparams.height = tempval; layoutOftenLayout.setLayoutParams(temparams); searchEditText.addTextChangedListener(new TextWatcher() { private boolean isChanged = false; @Override public void afterTextChanged(Editable s) { if (isChanged) { return; } if (0 == searchEditText.getText().length()) { mIsSearch = false; isChanged = true; msearchContent = null; searchEditText.setSelectAllOnFocus(true); isChanged = false; setupAllContactsView(); searchEditText.invalidate(); } else { mIsSearch = true; msearchContent = new String(searchEditText.getText() .toString()); setupAllContactsView(); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { if (isChanged) { return; } } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // String searchContent = new String(searchEditText.getText() // .toString()); } }); } private void setupAllContactsView() { if (mApp.mTelList == null) return; addListData(); mBtnAll.setText("全部联系人(" + (mData.size() - splitNum) + ")"); // 全部联系人适配器 mAdapter = new AllContactsAdapter(this); mListView = (ListView) findViewById(R.id.contact_list); mListView.setAdapter(mAdapter); setupAlphaView(); mListView.setOnItemClickListener(new ItemClickListener2()); // 添加长按点击 mListView .setOnCreateContextMenuListener(new OnCreateContextMenuListener() { @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; if (mData.get(info.position).mContactId != 0) { menu.setHeaderTitle((String) mData .get(info.position).mName); longClickIndex = info.position; menu.add(0, 0, 0, "打电话"); menu.add(0, 1, 0, "转发名片"); menu.add(0, 2, 0, "删除联系人"); } } }); mListView.setOnScrollListener(new OnScrollListener() { /** * 滚动状态改变时调用 */ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // // 不滚动时保存当前滚动到的位置 // if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { // // RelativeLayout layoutOftenLayout = (RelativeLayout) // findViewById(R.id.contacts_layout4); // RelativeLayout lineBelowOftenLayout = (RelativeLayout) // findViewById(R.id.contacts_layoutline2); // int scrolledX = mListView.getScrollX(); // int scrolledY = mListView.getScrollY(); // if(scrolledX == 0 && scrolledY == 0) // { // layoutOftenLayout.setVisibility(0); // lineBelowOftenLayout.setVisibility(0); // GridView gridview = (GridView) findViewById(R.id.gridview); // int gridHeight = gridview.getLayoutParams().height; // ViewGroup.LayoutParams temParams = layoutOftenLayout // .getLayoutParams(); // temParams.height = gridHeight; // layoutOftenLayout.setLayoutParams(temParams); // } // else { // layoutOftenLayout.setVisibility(8); // lineBelowOftenLayout.setVisibility(8); // } // // } mAllListScrollState = scrollState; } /** * 滚动时调用 */ @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { RelativeLayout layoutOftenLayout = (RelativeLayout) findViewById(R.id.contacts_layout4); RelativeLayout lineBelowOftenLayout = (RelativeLayout) findViewById(R.id.contacts_layoutline2); if (mAllListScrollState != AbsListView.OnScrollListener.SCROLL_STATE_IDLE && firstVisibleItem == 0 && mOftenListVisible != 0) { layoutOftenLayout.setVisibility(0); lineBelowOftenLayout.setVisibility(0); GridView gridview = (GridView) findViewById(R.id.gridview); int gridHeight = gridview.getLayoutParams().height; ViewGroup.LayoutParams temParams = layoutOftenLayout .getLayoutParams(); temParams.height = gridHeight; layoutOftenLayout.setLayoutParams(temParams); mOftenListVisible = 0; } else if (mAllListScrollState != AbsListView.OnScrollListener.SCROLL_STATE_IDLE && firstVisibleItem != 0 && mOftenListVisible != 1) { layoutOftenLayout.setVisibility(8); lineBelowOftenLayout.setVisibility(8); mOftenListVisible = 1; } } }); } private void setupAlphaView() { // TODO Auto-generated method stub mQuickSearchBar = (ImageView) findViewById(R.id.quick_search_bar); mQuickSearchThumb = (ImageView) findViewById(R.id.quick_search_thumb); mQuickSearchIcon = (ImageView) findViewById(R.id.toast_image); mQuickTip = (LinearLayout) findViewById(R.id.toast_container); mTipText = (TextView) findViewById(R.id.toast_text); mQuickSearchBar.setClickable(true); mQuickSearchBar.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) { TranslateAnimation animation = new TranslateAnimation(0, 0, event.getY(), event.getY()); animation.setFillAfter(false); animation.setDuration(1); animation.setFillBefore(false); mQuickSearchThumb.startAnimation(animation); int nTop = mQuickSearchBar.getTop(); int nBottom = mQuickSearchBar.getBottom(); float nBtw = (nBottom - nTop) / 30f; int nIndex = (int) ((event.getY() - nTop + nBtw / 2) / nBtw); // ViewGroup.LayoutParams para = // mQuickSearchThumb.getLayoutParams(); // para.height = 300; // para.width = 300; // mQuickSearchThumb.setLayoutParams(para); // mQuickSearchThumb.setPadding( // mQuickSearchThumb.getPaddingLeft(), (int) // (mQuickSearchThumb.getPaddingTop()+event.getY()), // mQuickSearchThumb.getPaddingRight(), // mQuickSearchThumb.getPaddingBottom()); // // mQuickSearchThumb.setVisibility(View.VISIBLE); mQuickTip.setVisibility(View.VISIBLE); nIndex--; String strText = ""; if (0 < nIndex && nIndex < 27) { // a-z strText = String.valueOf((char) ('A' + nIndex)); int alphaIndex1 = mAdapter.getAlphaIndex(nIndex); mListView.setSelection(alphaIndex1); mTipText.setText(strText); mQuickSearchIcon.setVisibility(View.GONE); mTipText.setVisibility(View.VISIBLE); } else if (nIndex == 0) { mListView.setSelection(0); mQuickSearchIcon.setVisibility(View.VISIBLE); mTipText.setVisibility(View.GONE); // search } else if (nIndex == 27) { // # strText = "#"; int alphaIndex = mAdapter.getAlphaIndex(26); mListView.setSelection(alphaIndex); // strText += (""+event.getY()); mTipText.setText(strText); mQuickSearchIcon.setVisibility(View.GONE); mTipText.setVisibility(View.VISIBLE); } } if (event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_UP) { mQuickSearchThumb.setVisibility(View.GONE); mQuickTip.setVisibility(View.GONE); } return false; } }); } // 长按菜单响应函数 @Override public boolean onContextItemSelected(MenuItem item) { // setTitle("点击了长按菜单里面的第"+item.getItemId()+"个项目"); if (mApp.mTelList == null) return super.onContextItemSelected(item); if (item.getItemId() == 0) { Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + mData.get(longClickIndex).mTel)); startActivity(intent); } else if (item.getItemId() == 2) { Cursor cursor = getContentResolver().query(Data.CONTENT_URI, new String[] { Data.RAW_CONTACT_ID }, ContactsContract.Contacts.DISPLAY_NAME + "=?", new String[] { mData.get(longClickIndex).mName }, null); ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); if (cursor.moveToFirst()) { do { long Id = cursor.getLong(cursor .getColumnIndex(Data.RAW_CONTACT_ID)); ops.add(ContentProviderOperation.newDelete( ContentUris.withAppendedId(RawContacts.CONTENT_URI, Id)).build()); try { getContentResolver().applyBatch( ContactsContract.AUTHORITY, ops); } catch (Exception e) { } } while (cursor.moveToNext()); cursor.close(); } Log.i("ticket time 1 ContactListActivity2 begin 1", "" + System.currentTimeMillis()); // Thread th = new Thread(new Runnable() { // // @Override // public void run() { // // TODO Auto-generated method stub // while (mApp.mRemoteService == null) { // Log.i("after del contact", "Sleep"); // SystemClock.sleep(1000); // } // Log.i("ticket time 1 ContactListActivity2 begin 2", "" // + System.currentTimeMillis()); // mApp.sendSrvForeMsg( // ChatAppConstant.SRV_ForeMsg_Fetch_Contacts, null, // null); // } // // }); // th.start(); for (int i = 0; i < mApp.mTelList.size(); i++) { TelNode item1 = mApp.mTelList.get(i); if (item1.mContactId != 0 && item1.mName.equals(mData.get(longClickIndex).mName)) { mApp.mTelList.remove(i); break; } } this.refresh(); } else { Toast.makeText(ContactListActivity2.this, "你点击了长按菜单里面的第" + item.getItemId() + "个项目", Toast.LENGTH_SHORT).show(); } return super.onContextItemSelected(item); } class ItemClickListener implements OnItemClickListener // 常用联系人点击 { public void onItemClick(AdapterView<?> arg0,// The AdapterView where the // click happened View arg1,// The view within the AdapterView that was clicked int arg2,// The position of the view in the adapter long arg3// The row id of the item that was clicked ) { // 在本例中arg2=arg3 if (mApp.mTelList == null) return; HashMap<String, Object> item = (HashMap<String, Object>) arg0 .getItemAtPosition(arg2); Log.i("FragmentComplexList11", "Item clicked: " + arg2); Intent intent = new Intent(); intent.setClass(ContactListActivity2.this, ChatListActivity.class); Bundle bundle = new Bundle(); String tel = (String) mApp.mOftenContacts.get(arg2).mTel;// oftencontactstel[arg2]; String name = (String) mApp.mOftenContacts.get(arg2).mName; bundle.putString("tel", tel); bundle.putString("name", name); intent.putExtras(bundle); arg1.getContext().startActivity(intent); } } class ItemClickListener2 implements OnItemClickListener // 所有联系人点击 { public void onItemClick(AdapterView<?> arg0,// The AdapterView where the // click happened View arg1,// The view within the AdapterView that was clicked int arg2,// The position of the view in the adapter long arg3// The row id of the item that was clicked ) { // 在本例中arg2=arg3 if (mApp.mTelList == null) return; if (mData.get(arg2).mContactId != 0) { Log.i("FragmentComplexList22", "Item clicked: " + arg2); Intent intent = new Intent(); intent.setClass(ContactListActivity2.this, ChatListActivity.class); Bundle bundle = new Bundle(); String tel = (String) mData.get(arg2).mTel; String name = (String) mData.get(arg2).mName; bundle.putString("tel", tel); bundle.putString("name", name); intent.putExtras(bundle); arg1.getContext().startActivity(intent); } } } private void addListData() { if (mApp.mTelList == null) return; char firstchar = 0; if (mIsSearch) firstchar = msearchContent.charAt(0); mData.clear(); splitNum = 0; mData = new ArrayList<TelNode>(); for (int i = 0; i < mApp.mTelList.size(); i++) { TelNode item = mApp.mTelList.get(i); if (mIsSearch) { if ((firstchar >= 0x0391) && (firstchar <= 0xFFE5))// 汉字 { if (item.mContactId != 0 && item.mName.contains(msearchContent)) { mData.add(item); } } else if ((firstchar >= 0x0000) && (firstchar <= 0x00FF))// 英文 { if (item.mContactId != 0 && item.mPinyin.contains(msearchContent)) { mData.add(item); } else if (item.mContactId != 0 && item.mCapPinyin != null && item.mCapPinyin.contains(msearchContent)) { mData.add(item); } } else if ((firstchar >= 0x0030) && (firstchar <= 0x0039))// 数字0-9 { if (item.mContactId != 0 && item.mTel.contains(msearchContent)) { mData.add(item); } } } else { if (item.mContactId != 0) { mData.add(item); } } } // sort list Collections.sort(mData, new SortByPinyin()); splitByPinyin(); for (int i = 0; i < mData.size(); i++) { Log.i("list", mData.get(i).mName + "pinyin=" + mData.get(i).mPinyin); } } private void splitByPinyin() { char dChat = 0; for (int i = 0; i < mData.size(); i++) { TelNode item = mData.get(i); if (item.mPinyin == null || item.mPinyin == "") continue; char fChar = item.mPinyin.charAt(0); if (fChar != dChat) { if (fChar >= 'a' && fChar <= 'z') { mAlphaIndex[fChar - 'a'] = i; dChat = fChar; TelNode separator = new TelNode(); separator.mName = String.valueOf(dChat).toUpperCase(); separator.mTel = null; mData.add(i, separator); splitNum++; i++; } else if ((fChar >= '0' && fChar <= '9') || fChar == '+') { if (dChat == '#') continue; mAlphaIndex[26] = i; dChat = '#'; TelNode separator = new TelNode(); separator.mName = String.valueOf('#'); separator.mTel = null; mData.add(i, separator); splitNum++; i++; } } } } public void refresh() { Log.i("ContactListActivity2", "come back"); Log.i("ticket time 1 ContactListActivity2 refresh 1", "" + System.currentTimeMillis()); finish(); Log.i("ticket time 1 ContactListActivity2 refresh 2", "" + System.currentTimeMillis()); Intent intent = new Intent(); intent.setClass(ContactListActivity2.this, ContactListActivity2.class); Log.i("ticket time 1 ContactListActivity2 refresh 3", "" + System.currentTimeMillis()); this.startActivity(intent); } public class AllContactsAdapter extends BaseAdapter { private LayoutInflater mInflater; public AllContactsAdapter(Context context) { this.mInflater = LayoutInflater.from(context); } @Override public int getCount() { // TODO Auto-generated method stub return mData.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { // ViewHolder holder = null; // final int id = position; // if (convertView == null) { // holder = new ViewHolder(); // convertView = mInflater.inflate(R.layout.item_contact_list2, // null); // holder.mImg = (ImageView) convertView // .findViewById(R.id.contact_icon); // holder.mName = (TextView) convertView // .findViewById(R.id.contact_text_name); // holder.mTel = (TextView) convertView // .findViewById(R.id.contact_text_tel); // holder.viewBtn = (Button) convertView // .findViewById(R.id.buttoninvite); // // // LinearLayout linearlayout2 = // (LinearLayout)convertView.findViewById(R.id.itemlinelayout1); // int tempval = getWindowManager().getDefaultDisplay().getWidth(); // ViewGroup.LayoutParams temparams = // linearlayout2.getLayoutParams(); // temparams.width = tempval - 36 - 60 - 150 - 1; // linearlayout2.setLayoutParams(temparams); // // convertView.setTag(holder); // } else { // holder = (ViewHolder) convertView.getTag(); // } // holder.mImg.setBackgroundResource((Integer) R.drawable.machao); // holder.mName.setText((String) mData.get(position).mName); // holder.mTel.setText((String) mData.get(position).mTel); // holder.viewBtn.setOnClickListener(new View.OnClickListener() { // @Override // public void onClick(View v) { // Toast.makeText(ContactListActivity2.this, // "邀请" + (String) mData.get(id).mName, // Toast.LENGTH_SHORT).show(); // } // }); // return convertView; ViewHolder holder = null; TelNode item = mData.get(position); int i1 = 0; int i2 = 0; char firstchar = 0; if (mIsSearch) firstchar = msearchContent.charAt(0); if (convertView == null) { holder = new ViewHolder(); if (item.mTel != null) { convertView = mInflater.inflate(R.layout.item_contact_list, null); } else { convertView = mInflater.inflate( R.layout.item_news_separator, null); } convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } if (holder == null) { holder = new ViewHolder(); } if (item.mTel != null) { if (holder.mName == null || holder.mName.getId() != R.id.contact_text_name) { convertView = mInflater.inflate(R.layout.item_contact_list, null); } holder.mIcon = (TextView) convertView .findViewById(R.id.contact_text_icon); holder.mName = (TextView) convertView .findViewById(R.id.contact_text_name); holder.mTel = (TextView) convertView .findViewById(R.id.contact_text_tel); holder.mName.setText(item.mName); holder.mIcon.setText(item.mName.substring(0, 1)); holder.mTel.setText(item.mTel); if (mIsSearch) { if ((firstchar >= 0x0391) && (firstchar <= 0xFFE5))// 汉字 { if (item.mContactId != 0 && item.mName.contains(msearchContent)) { Spannable span = (Spannable) holder.mName.getText(); TextAppearanceSpan textappearancespan = new TextAppearanceSpan( convertView.getContext(), R.style.search_name_hightlight_style); span.removeSpan(textappearancespan); i1 = holder.mName.getText().toString() .indexOf(msearchContent); i2 = msearchContent.length(); if (0 <= holder.mName.getText().toString() .indexOf(msearchContent) && holder.mName.getText().toString() .indexOf(msearchContent) <= holder.mName .getText().length() && 1 <= msearchContent.length() && msearchContent.length() <= holder.mName .getText().length()) span.setSpan(textappearancespan, i1, i1 + i2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } else if ((firstchar >= 0x0000) && (firstchar <= 0x00FF))// 英文 { if (item.mContactId != 0 && item.mPinyin.contains(msearchContent)) { Spannable span = (Spannable) holder.mName.getText(); TextAppearanceSpan textappearancespan = new TextAppearanceSpan( convertView.getContext(), R.style.search_name_hightlight_style); span.removeSpan(textappearancespan); i1 = holder.mName.getText().toString() .indexOf(msearchContent); i2 = msearchContent.length(); if (0 <= holder.mName.getText().toString() .indexOf(msearchContent) && holder.mName.getText().toString() .indexOf(msearchContent) <= holder.mName .getText().length() && 1 <= msearchContent.length() && msearchContent.length() <= holder.mName .getText().length()) span.setSpan(textappearancespan, i1, i1 + i2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } else if ((firstchar >= 0x0030) && (firstchar <= 0x0039))// 数字0-9 { if (item.mContactId != 0 && item.mTel.contains(msearchContent)) { Spannable span = (Spannable) holder.mTel.getText(); TextAppearanceSpan textappearancespan = new TextAppearanceSpan( convertView.getContext(), R.style.search_tel_hightlight_style); span.removeSpan(textappearancespan); i1 = holder.mName.getText().toString() .indexOf(msearchContent); i2 = msearchContent.length(); if (0 <= holder.mTel.getText().toString() .indexOf(msearchContent) && holder.mTel.getText().toString() .indexOf(msearchContent) <= holder.mTel .getText().length() && 1 <= msearchContent.length() && msearchContent.length() <= holder.mTel .getText().length()) span.setSpan(textappearancespan, i1, i1 + i2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } } convertView.setTag(holder); } else { convertView = mInflater.inflate(R.layout.item_news_separator, null); holder.mName = (TextView) convertView .findViewById(R.id.news_text_separator); holder.mName.setText(item.mName); } return convertView; } public int getAlphaIndex(int alpha) { return mAlphaIndex[alpha]; } } class SortByPinyin implements Comparator<Object> { public int compare(Object o1, Object o2) { TelNode item1 = (TelNode) o1; TelNode item2 = (TelNode) o2; if (item1.mPinyin == null || item1.mPinyin == "") { return -1; } else if (item2.mPinyin == null || item2.mPinyin == "") { return 1; } if (item1.mPinyin.charAt(0) > item2.mPinyin.charAt(0)) return 1; else if (item1.mPinyin.charAt(0) < item2.mPinyin.charAt(0)) return -1; else return 0; } } }