activiity代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
/**
-
@Description:联系人显示界面
-
@author http://blog.csdn.net/finddreams
*/
public class MainActivity extends Activity {private View mBaseView;
private ListView sortListView;
private SideBar sideBar;
private TextView dialog;
private SortAdapter adapter;
private ClearEditText mClearEditText;
private Map<String, String> callRecords;private CharacterParser characterParser;
private List SourceDateList;private PinyinComparator pinyinComparator;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_contact);
initView();
initData();
}private void initView() {
sideBar = (SideBar) this.findViewById(R.id.sidrbar);
dialog = (TextView) this.findViewById(R.id.dialog);sortListView = (ListView) this.findViewById(R.id.sortlist);
}
private void initData() {
// 实例化汉字转拼音类
characterParser = CharacterParser.getInstance();pinyinComparator = new PinyinComparator(); sideBar.setTextView(dialog); // 设置右侧触摸监听 sideBar.setOnTouchingLetterChangedListener(new SideBar.OnTouchingLetterChangedListener() { @SuppressLint("NewApi") @Override public void onTouchingLetterChanged(String s) { // 该字母首次出现的位置 int position = adapter.getPositionForSection(s.charAt(0)); if (position != -1) { sortListView.setSelection(position); } } }); sortListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 这里要利用adapter.getItem(position)来获取当前position所对应的对象 // Toast.makeText(getApplication(), // ((SortModel)adapter.getItem(position)).getName(), // Toast.LENGTH_SHORT).show(); String number = callRecords.get(((SortModel) adapter .getItem(position)).getName()); Toast.makeText(MainActivity.this, number, Toast.LENGTH_SHORT).show(); } }); new ConstactAsyncTask().execute(0);
}
private class ConstactAsyncTask extends AsyncTask<Integer, Integer, Integer> {
@Override protected Integer doInBackground(Integer... arg0) { int result = -1; callRecords = ConstactUtil.getAllCallRecords(MainActivity.this); result = 1; return result; } @Override protected void onPostExecute(Integer result) { super.onPostExecute(result); if (result == 1) { List<String> constact = new ArrayList<String>(); for (Iterator<String> keys = callRecords.keySet().iterator(); keys .hasNext();) { String key = keys.next(); constact.add(key); } String[] names = new String[] {}; names = constact.toArray(names); SourceDateList = filledData(names); // 根据a-z进行排序源数据 Collections.sort(SourceDateList, pinyinComparator); adapter = new SortAdapter(MainActivity.this, SourceDateList); sortListView.setAdapter(adapter); mClearEditText = (ClearEditText) MainActivity.this .findViewById(R.id.filter_edit); mClearEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View arg0, boolean arg1) { mClearEditText.setGravity(Gravity.LEFT|Gravity.CENTER_VERTICAL); } }); // 根据输入框输入值的改变来过滤搜索 mClearEditText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // 当输入框里面的值为空,更新为原来的列表,否则为过滤数据列表 filterData(s.toString()); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } }); } } @Override protected void onPreExecute() { super.onPreExecute(); }
}
/**
-
为ListView填充数据
-
@param date
-
@return
*/
private List filledData(String[] date) {
List mSortList = new ArrayList();for (int i = 0; i < date.length; i++) {
SortModel sortModel = new SortModel();
sortModel.setName(date[i]);
// 汉字转换成拼音
String pinyin = characterParser.getSelling(date[i]);
String sortString = pinyin.substring(0, 1).toUpperCase();// 正则表达式,判断首字母是否是英文字母 if (sortString.matches("[A-Z]")) { sortModel.setSortLetters(sortString.toUpperCase()); } else { sortModel.setSortLetters("#"); } mSortList.add(sortModel);
}
return mSortList;
}
/**
-
根据输入框中的值来过滤数据并更新ListView
-
@param filterStr
*/
private void filterData(String filterStr) {
List filterDateList = new ArrayList();if (TextUtils.isEmpty(filterStr)) {
filterDateList = SourceDateList;
} else {
filterDateList.clear();
for (SortModel sortModel : SourceDateList) {
String name = sortModel.getName();
if (name.indexOf(filterStr.toString()) != -1
|| characterParser.getSelling(name).startsWith(
filterStr.toString())) {
filterDateList.add(sortModel);
}
}
}// 根据a-z进行排序
Collections.sort(filterDateList, pinyinComparator);
adapter.updateListView(filterDateList);
}
-
}
适配器:
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.SectionIndexer;
import android.widget.TextView;
/**
-
@Description:用来处理集合中数据的显示与排序
-
@author http://blog.csdn.net/finddreams
*/
public class SortAdapter extends BaseAdapter implements SectionIndexer{
private List list = null;
private Context mContext;public SortAdapter(Context mContext, List list) {
this.mContext = mContext;
this.list = list;
}/**
- 当ListView数据发生变化时,调用此方法来更新ListView
- @param list
*/
public void updateListView(List list){
this.list = list;
notifyDataSetChanged();
}
public int getCount() {
return this.list.size();
}public Object getItem(int position) {
return list.get(position);
}public long getItemId(int position) {
return position;
}public View getView(final int position, View view, ViewGroup arg2) {
ViewHolder viewHolder = null;
final SortModel mContent = list.get(position);
if (view == null) {
viewHolder = new ViewHolder();
view = LayoutInflater.from(mContext).inflate(R.layout.phone_constacts_item, null);
viewHolder.tvTitle = (TextView) view.findViewById(R.id.title);
viewHolder.tvLetter = (TextView) view.findViewById(R.id.catalog);
viewHolder.icon = (ImageTextView) view.findViewById(R.id.icon);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}//根据position获取分类的首字母的Char ascii值 int section = getSectionForPosition(position); //如果当前位置等于该分类首字母的Char的位置 ,则认为是第一次出现 if(position == getPositionForSection(section)){ viewHolder.tvLetter.setVisibility(View.VISIBLE); viewHolder.tvLetter.setText(mContent.getSortLetters()); }else{ viewHolder.tvLetter.setVisibility(View.GONE); } viewHolder.tvTitle.setText(this.list.get(position).getName()); viewHolder.icon.setText(this.list.get(position).getName()); viewHolder.icon.setIconText(mContext,this.list.get(position).getName()); return view;
}
final static class ViewHolder {
TextView tvLetter;
TextView tvTitle;
ImageTextView icon;}
/**
- 根据ListView的当前位置获取分类的首字母的Char ascii值
*/
public int getSectionForPosition(int position) {
return list.get(position).getSortLetters().charAt(0);
}
/**
-
根据分类的首字母的Char ascii值获取其第一次出现该首字母的位置
*/
public int getPositionForSection(int section) {
for (int i = 0; i < getCount(); i++) {
String sortStr = list.get(i).getSortLetters();
char firstChar = sortStr.toUpperCase().charAt(0);
if (firstChar == section) {
return i;
}
}return -1;
}
/**
- 提取英文的首字母,非英文字母用#代替。
- @param str
- @return
*/
private String getAlpha(String str) {
String sortStr = str.trim().substring(0, 1).toUpperCase();
// 正则表达式,判断首字母是否是英文字母
if (sortStr.matches("[A-Z]")) {
return sortStr;
} else {
return “#”;
}
}
@Override
public Object[] getSections() {
return null;
}
}
activity布局:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.example.wengd.contract.ClearEditText
android:id="@+id/filter_edit"
android:layout_width="fill_parent"
android:layout_height="40dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="5dip"
android:gravity="center"
android:background="@drawable/acm_inputbox"
android:drawableLeft="@drawable/search"
android:hint="@string/search"
android:singleLine="true"
android:textSize="15.0dip" />
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<ListView
android:id="@+id/sortlist"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/whites"
android:listSelector="@drawable/comm_btn_selector"
android:layout_gravity="center" />
<TextView
android:id="@+id/dialog"
android:layout_width="80.0dip"
android:layout_height="80.0dip"
android:layout_gravity="center"
android:background="@drawable/number_base"
android:gravity="center"
android:textColor="#ffffffff"
android:textSize="30.0dip"
android:visibility="invisible" />
<com.example.wengd.contract.SideBar
android:id="@+id/sidrbar"
android:layout_width="30.0dip"
android:layout_height="fill_parent"
android:layout_gravity="right|center" />
</FrameLayout>
</LinearLayout>
item布局: <?xml version="1.0" encoding="utf-8"?>
<TextView
android:id="@+id/catalog"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#454545"
android:paddingLeft="5dip"
android:paddingTop="5dip"
android:clickable="false"
android:enabled="false"
android:background="@color/bg_sort_color"
android:paddingBottom="5dip"/>
<LinearLayout
android:id="@+id/ll_constact"
android:layout_height="60dp"
android:layout_width="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical"
>
<com.example.wengd.contract.ImageTextView
android:id="@+id/icon"
android:layout_marginLeft="5dip"
android:layout_height="wrap_content"
android:layout_width="45dip"
android:text="find"
/>
<TextView
android:id="@+id/title"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:textColor="#336598"
android:layout_marginLeft="10dp"
android:textSize="18sp"/>
</LinearLayout>