当前位置: 代码迷 >> Android >> Android联系人自动过滤并展示“新建联系人”
  详细解决方案

Android联系人自动过滤并展示“新建联系人”

热度:31   发布时间:2016-05-01 20:41:28.0
Android联系人自动过滤并显示“新建联系人”

此文写给新手的 高手莫看哈!!!


主要更改是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;	}}
?

?

?

?

?

?

?

?

  相关解决方案