此文写给新手的 高手莫看哈!!!
主要更改是ListView的adapter来实现自动过滤。
Demo结构:
java文件:
ContactActivity.java 主屏幕
NewContactAdapter.java 显示“新建联系人”的adapter
PhoneNumberAdapter.java 显示通讯录得adapter
ContactEntity.java 通讯录实体类
Layout文件:
main.xml 一个editText和一个listView
list_item.xml 自定义listview的item布局
list_item_2.xml “新建联系人”的item布局
主要是下面三个文件(demo已上传 有需要的可以下载)
ContactActivity.java
package com.yalitong.activity; import java.util.ArrayList; import java.util.List; import com.yalitong.adapter.NewContactAdapter; import com.yalitong.adapter.PhoneNumberAdapter; import com.yalitong.entity.ContactEntity; import android.app.Activity; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.view.KeyEvent; import android.view.View; import android.view.View.OnKeyListener; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.ListView; public class ContactActivity extends Activity { // private String tag = "ContactActivity"; private Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; private String[] projection = new String[] { ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER }; private Cursor cursor = null; private ListView listView = null; private EditText numberEditText = null; private BaseAdapter baseAdapter = null; private List<ContactEntity> list = new ArrayList<ContactEntity>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); listView = (ListView)findViewById(R.id.list); baseAdapter = new PhoneNumberAdapter(this,list); listView.setAdapter(baseAdapter); numberEditText = (EditText)findViewById(R.id.number); numberEditText.setOnKeyListener(new NumberTextView()); } @Override protected void onResume() { super.onResume(); queryContacts(uri, projection, null, null, null); } /** * 监听键盘事件 * @author yangfan * */ private class NumberTextView implements OnKeyListener{ String queryNubmer = null; String selection = null; String[] selectionArgs = null; @Override public boolean onKey(View v, int keyCode, KeyEvent event) { numberEditText = (EditText)v; queryNubmer = numberEditText.getText().toString().trim(); //70-83行可以再优化一下,我这里每次事件都会去查询通讯录 这样肯定不是最好的 大家可以自己优化下 //每次点击键盘的时候先清理list中的数据,如果不清除原先的数据,就会导致ListView数据不停地增加 list.clear(); // selection = ContactsContract.CommonDataKinds.Phone.NUMBER +" like ?"; selectionArgs = new String[]{queryNubmer + "%"}; queryContacts(uri, projection, selection, selectionArgs, null); if(list.size() == 0){ //当没有查到数据的时候 显示“新建联系人”字样 baseAdapter = new NewContactAdapter(ContactActivity.this); }else if(list.size() > 0){ baseAdapter = new PhoneNumberAdapter(ContactActivity.this,list); } listView.setAdapter(baseAdapter); baseAdapter.notifyDataSetChanged(); return false; } } /** * 查询通讯录中的数据 并添加在list中 * @param uri * @param projection * @param selection * @param selectionArgs * @param sortOrder */ private void queryContacts(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder){ cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder); ContactEntity contactEntity = null; if(cursor.getCount() > 0){ while(cursor.moveToNext()){ contactEntity = new ContactEntity(); contactEntity.setContactName(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))); contactEntity.setContactNumber(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); list.add(contactEntity); } } } }
PhoneNumberAdapter.java
package com.yalitong.adapter; import java.util.List; import com.yalitong.activity.R; import com.yalitong.entity.ContactEntity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class PhoneNumberAdapter extends BaseAdapter { // private String tag = "PhoneNumberAdapter"; private Context context = null; private List<ContactEntity> list = null; public PhoneNumberAdapter(Context context , List<ContactEntity> list){ this.context = context; this.list = list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null){ convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null); CacheView cacheView = new CacheView(); cacheView.nameTextView = (TextView)convertView.findViewById(R.id.item_name); cacheView.numberTextView = (TextView)convertView.findViewById(R.id.item_number); convertView.setTag(cacheView); } CacheView cacheView = (CacheView)convertView.getTag(); cacheView.nameTextView.setText(list.get(position).getContactName()); cacheView.numberTextView.setText(list.get(position).getContactNumber()); return convertView; } private class CacheView{ TextView nameTextView = null; TextView numberTextView = null; } }
NewContactAdapter.java
package com.yalitong.adapter; import com.yalitong.activity.R; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class NewContactAdapter extends BaseAdapter { // private String tag = "NewContactAdapter"; private Context context = null; public NewContactAdapter(Context context){ this.context = context; } @Override public int getCount() { // TODO Auto-generated method stub return 1; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { //listView中最常见的优化方法 if(convertView == null){ convertView = LayoutInflater.from(context).inflate(R.layout.list_item_2, null); CacheView cacheView = new CacheView(); cacheView.nameTextView = (TextView)convertView.findViewById(R.id.newContact); convertView.setTag(cacheView); } CacheView cacheView = (CacheView)convertView.getTag(); cacheView.nameTextView.setText(R.string.newContact); return convertView; } private class CacheView{ TextView nameTextView = null; } }
相关推荐
Android 进一步推进了 " 随时随地为每个人提供信息 " 这一企 业 目标的实现。 � Open Handset Alliance 汇集了多家业界巨头。运营商如: China Mobile 、 NTT DoCoMo 、 Vodafone 、 T-M obile 等;设备制造商如 ...
- **运行时权限**:指的是应用程序在运行时请求的权限,如访问联系人、发送短信等。 - **文件系统权限**:指对文件和目录的访问权限,如读写文件。 #### 27. 指定浏览器访问指定页面的方法 通过Intent的setData()...
鉴于市场上用户的手机型号、种类、屏幕分辨率等参差不齐,传统方式根据主流系统分别开发相应的系统耗时又耗力,为了高效开发并节约开发项目成本,本文采用Android+HTML5相结合的方式进行移动端Web系统的设计研发工作...