在开发中经常用到获取联系人和搜索框,今天总结一下。
代码很多借鉴于:http://blog.csdn.net/wyzxk888/article/details/8800407
在些基础上做了修改,代码做了适量封装,能够直接适用于项目中。
运行效果图:
代码目录结构:
![这里写图片描述](https://img-blog.csdn.net/20151130230330020
1、在Activity中做调用,得到联系人,对EditText设置监听。
public class MainActivity extends Activity implements TextWatcher {
private ListAdapter adapter;
private ArrayList<Person> list;
private EditText searchbox;
private ListView listview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
searchbox = (EditText) findViewById(R.id.searchbox);
listview = (ListView) findViewById(R.id.listview);
list = new ArrayList<Person>();
// Person p1 = new Person("于小刚", "13525568711");
// Person p2 = new Person("张三", "13500001234");
// Person p3 = new Person("小张", "13800001234");
// Person p4 = new Person("李四", "13600001111");
// Person p5 = new Person("abc", "17900001112");
// Person p6 = new Person("abcd", "17900001113");
// Person p7 = new Person("小王", "17900001114");
// list.add(p1);
// list.add(p2);
// list.add(p3);
// list.add(p4);
// list.add(p5);
// list.add(p6);
// list.add(p7);
//adapter = new ListAdapter(list, this);
PhoneUtils.getNumber(this);
//得到联系人;
adapter = new ListAdapter(PhoneUtils.list, this);
//设置给adapter;
listview.setAdapter(adapter);
//给EditText设置监听;
searchbox.addTextChangedListener(this);
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int before,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
adapter.getFilter().filter(s); // 当数据改变时,调用过滤器;
}
}
2、在adapter设置数据,并且得到EditText的监听,改变listview;
public class ListAdapter extends BaseAdapter implements Filterable {
private List<Person> list;
private Context context;
private PersonFilter filter;
public ListAdapter(List<Person> list, Context context) {
this.list = list;
this.context = context;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.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(context).inflate(R.layout.list_item, null);
}
Person p = list.get(position);
TextView name = (TextView)convertView.findViewById(R.id.name);
TextView number = (TextView)convertView.findViewById(R.id.number);
name.setText(p.name);
number.setText(p.number + "");
return convertView;
}
@Override
public android.widget.Filter getFilter() {
if (filter == null) {
filter = new PersonFilter(list);
}
return filter;
}
private class PersonFilter extends android.widget.Filter {
private List<Person> original;
public PersonFilter(List<Person> list) {
this.original = list;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint == null || constraint.length() == 0) {
results.values = original;
results.count = original.size();
} else {
List<Person> mList = new ArrayList<Person>();
for (Person p: original) {
if (p.name.toUpperCase().startsWith(constraint.toString().toUpperCase())
|| new String(p.number + "").toUpperCase().startsWith(constraint.toString().toUpperCase())) {
mList.add(p);
}
}
results.values = mList;
results.count = mList.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
list = (List<Person>)results.values;
notifyDataSetChanged();
}
}
}
3、bean类,比较简单。
public class Person {
public String name;
public String number;
public Person(String firtname, String number) {
this.name = firtname;
this.number =number;
}
}
4、获取联系人的工具类:
public class PhoneUtils {
// 获得手机上的联系人,并保存入集合;
public static List<Person> list = new ArrayList<Person>();
public static String getNumber(Context context) {
Cursor cursor = context.getContentResolver().query(
CommonDataKinds.Phone.CONTENT_URI, null, null, null,
"sort_key asc");
String phoneNumber;
String phoneName;
while (cursor.moveToNext()) {
phoneNumber = cursor.getString(cursor
.getColumnIndex(CommonDataKinds.Phone.NUMBER));
phoneName = cursor.getString(cursor
.getColumnIndex(CommonDataKinds.Phone.DISPLAY_NAME));
Person phoneInfo = new Person(phoneName, phoneNumber);
list.add(phoneInfo);
Log.i("GetPhoneNumber", phoneName + "------" + phoneNumber);
}
cursor.close();
return null;
}
}
这样就实现了显示联系人并且带有搜索框的功能;
代码下载地址:http://download.csdn.net/detail/androidxiaogang/9314065