在开发中经常用到获取联系人和搜索框,今天总结一下。

代码很多借鉴于:http://blog.csdn.net/wyzxk888/article/details/8800407
在些基础上做了修改,代码做了适量封装,能够直接适用于项目中。

运行效果图:

代码目录结构:
![这里写图片描述](http://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

更多相关文章

  1. Android(安卓)Settings中的默认设置
  2. android app 不会被low memory killer回收
  3. 在Android(安卓)Studio上测试运行,Unity发布成Android包的环境搭
  4. android uiautomator写一个崩溃的监听
  5. android崩溃日志保存sdcard打开并发送到email
  6. Android的语言设置(二)
  7. Android(安卓)自定义方形验证码输入框,仿滴滴、小篮单车
  8. Android(安卓)Studio --> Gradle Build设置自动
  9. Android修改百度地图的显示范围的大小

随机推荐

  1. Android布局文件的属性值解析
  2. [Android] View和ViewGroup事件分发机制
  3. Android:WebService
  4. Android内存泄露专题——leakCanary源码
  5. AndroidX迁移
  6. Android(安卓)动态logo bootanimation.zi
  7. Android(安卓)源代码结构
  8. 初探Android
  9. Android(安卓)布局深度优化(减少布局层次
  10. Android控件TextView中ellipsize属性(设置