实例介绍
【实例简介】
【实例截图】
【核心代码】
package huahua.mycontacts;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
//联系人包含的信息
public static class Persons {
public String Name; //姓名
public String PY; //姓名拼音 (花花大神:huahuadashen)
public String Number; //电话号码
public String FisrtSpell; //中文名首字母 (花花大神:hhds)
}
//字母列视图View
private AlphabetScrollBar m_asb;
//显示选中的字母
private TextView m_letterNotice;
//联系人的列表
private ListView m_contactslist;
//联系人列表的适配器
private ListAdapter m_listadapter;
//所有联系人数组
private ArrayList<Persons> persons = new ArrayList<Persons>();
//搜索过滤联系人EditText
private EditText m_FilterEditText;
//没有匹配联系人时显示的TextView
private TextView m_listEmptyText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取手机中的联系人,并将所有联系人保存perosns数组中
//联系人比较多的话,初始化中会比较耗时,以后再优化
getContacts();
//得到字母列的对象,并设置触摸响应监听器
m_asb = (AlphabetScrollBar)findViewById(R.id.alphabetscrollbar);
m_asb.setOnTouchBarListener(new ScrollBarListener());
m_letterNotice = (TextView)findViewById(R.id.pb_letter_notice);
m_asb.setTextView(m_letterNotice);
// 根据拼音为联系人数组进行排序
Collections.sort(persons, new ComparatorPY());
//得到联系人列表,并设置适配器
m_contactslist = (ListView)findViewById(R.id.pb_listvew);
m_listadapter = new ListAdapter(this, persons);
m_contactslist.setAdapter(m_listadapter);
m_listEmptyText = (TextView)findViewById(R.id.pb_nocontacts_notice);
//初始化搜索编辑框,设置文本改变时的监听器
m_FilterEditText = (EditText)findViewById(R.id.pb_search_edit);
m_FilterEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(!"".equals(s.toString().trim()))
{
//根据编辑框值过滤联系人并更新联系列表
filterContacts(s.toString().trim());
m_asb.setVisibility(View.GONE);
}
else
{
m_asb.setVisibility(View.VISIBLE);
m_listadapter.updateListView(persons);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
}
public class ComparatorPY implements Comparator<Persons>{
@Override
public int compare(Persons lhs, Persons rhs) {
String str1 = lhs.PY;
String str2 = rhs.PY;
return str1.compareToIgnoreCase(str2);
}
}
public class ListAdapter extends BaseAdapter{
private LayoutInflater m_inflater;
private ArrayList<Persons> Persons;
private Context context;
public ListAdapter(Context context,
ArrayList<Persons> persons) {
this.m_inflater = LayoutInflater.from(context);
this.Persons = persons;
this.context = context;
}
//当联系人列表数据发生变化时,用此方法来更新列表
public void updateListView(ArrayList<Persons> persons){
this.Persons = persons;
notifyDataSetChanged();
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return Persons.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return Persons.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = m_inflater.inflate(R.layout.list_item, null);
TextView name = (TextView) convertView.findViewById(R.id.contacts_name);
name.setText(Persons.get(position).Name);
TextView number = (TextView) convertView.findViewById(R.id.contacts_number);
number.setText(Persons.get(position).Number);
//字母提示textview的显示
TextView letterTag = (TextView)convertView.findViewById(R.id.pb_item_LetterTag);
//获得当前姓名的拼音首字母
String firstLetter = Persons.get(position).PY.substring(0,1).toUpperCase();
//如果是第1个联系人 那么letterTag始终要显示
if(position == 0)
{
letterTag.setVisibility(View.VISIBLE);
letterTag.setText(firstLetter);
}
else
{
//获得上一个姓名的拼音首字母
String firstLetterPre = Persons.get(position-1).PY.substring(0,1).toUpperCase();
//比较一下两者是否相同
if(firstLetter.equals(firstLetterPre))
{
letterTag.setVisibility(View.GONE);
}
else
{
letterTag.setVisibility(View.VISIBLE);
letterTag.setText(firstLetter);
}
}
return convertView;
}
}
//字母列触摸的监听器
private class ScrollBarListener implements AlphabetScrollBar.OnTouchBarListener {
@Override
public void onTouch(String letter) {
//触摸字母列时,将联系人列表更新到首字母出现的位置
for (int i = 0; i < persons.size(); i ) {
if (persons.get(i).PY.substring(0, 1).compareToIgnoreCase(letter) == 0) {
m_contactslist.setSelection(i);
break;
}
}
}
}
public void getContacts() {
ContentResolver contentResolver = getContentResolver();
// 获得所有联系人数据集的游标
Cursor cursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI ,null, null, null, null);
// 循环遍历
if (cursor.moveToFirst()) {
int idColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID);
int displayNameColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
int NumberColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
while (cursor.moveToNext()){
Persons person = new Persons();
// 获得联系人的ID号
String contactId = cursor.getString(idColumn);
// 获得联系人姓名
person.Name = cursor.getString(displayNameColumn);
person.PY = PinyinUtils.getPingYin(person.Name);
person.FisrtSpell = PinyinUtils.getFirstSpell(person.Name);
person.Number = cursor.getString(NumberColumn);
Log.v("huahua", "名字:" person.Name "号码:" person.Number "姓名首字母:" person.FisrtSpell );
persons.add(person);
}
cursor.close();
}
}
private void filterContacts(String filterStr){
ArrayList<Persons> filterpersons = new ArrayList<Persons>();
//遍历所有联系人数组,筛选出包含关键字的联系人
for (int i = 0; i < persons.size(); i ) {
//过滤的条件
if (isStrInString(persons.get(i).Number,filterStr)
||isStrInString(persons.get(i).PY,filterStr)
||persons.get(i).Name.contains(filterStr)
||isStrInString(persons.get(i).FisrtSpell,filterStr)){
//将筛选出来的联系人重新添加到filterpersons数组中
Persons filterperson = new Persons();
filterperson.Name = persons.get(i).Name;
filterperson.PY = persons.get(i).PY;
filterperson.Number = persons.get(i).Number;
filterperson.FisrtSpell = persons.get(i).FisrtSpell;
filterpersons.add(filterperson);
}
}
//如果没有匹配的联系人
if(filterpersons.isEmpty())
{
m_contactslist.setEmptyView(m_listEmptyText);
}
//将列表更新为过滤的联系人
m_listadapter.updateListView(filterpersons);
}
public boolean isStrInString(String bigStr,String smallStr){
if(bigStr.toUpperCase().indexOf(smallStr.toUpperCase())>-1){
return true;
}else{
return false;
}
}
}
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


支持(0) 盖楼(回复)