此文写给新手的 高手莫看哈!!!
主要更改是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; }}?
?
?
?
?
?
?
?