此文写给新手的 高手莫看哈!!!
主要更改是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开发者在处理联系人、SIM卡联系人和最近联系人时,需要熟悉ContentProvider机制,掌握如何使用ContentResolver进行数据操作,并了解特定的URI和列名。同时,获取最近联系人可能需要额外的逻辑处理,如...
在Android系统中,联系人应用是用户日常交互的重要部分,其功能包括添加、编辑和查找联系人等。本文将深入探讨如何实现一个全特效的联系人应用,特别是字母表快速滚动的功能,使得用户能快速定位到特定联系人的名字...
在Android开发中,实现联系人字母排序,尤其是仿微信的字母栏导航功能,是一个常见的需求。这个DEMO项目就是专门针对这一功能进行演示的。在本文中,我们将深入探讨如何在Android应用中实现类似微信的联系人字母排序...
在Android平台上,开发一款应用需要调用通讯录、支持多选联系人以及提供查询时的自动提示补全功能,并能够发送信息,这涉及到多个关键知识点。以下是对这些知识点的详细说明: 1. **调用通讯录**:Android系统提供...
同时,为了显示联系人的头像,可能还需要使用Bitmap的加载库,如Glide或Picasso,来加载和缓存联系人的图片。 总的来说,实现一个带有拼音首字母排序和过滤搜索功能的Android通讯录应用,涉及到Android系统的...
仿Android联系人SideBar排序,根据拼音A-Z字母快速导航联系人姓名,以及输入搜索条件过滤,显示姓名的文字图片,添加挤压动画.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
此外,为了支持一个人拥有多个电话号码的情况,我们可以在列表中显示联系人的名字以及他们所有的电话号码。点击列表项后,可以选择特定的电话号码进行拨号或编辑。 总的来说,处理Android通讯录中的姓名重复问题和...
在Android平台上,与系统通讯录交互是常见的功能需求,它涉及到用户可以查看、选择联系人以及拨打电话。本文将详细讲解如何实现这些功能,并提供相关的编程知识点。 **一、Android调用系统通讯录** Android提供了...
在Android开发中,创建一个类似iPhone风格的联系人列表界面是一项常见的需求,它不仅需要展示联系人的基本信息,如姓名和电话,还应具备高效的搜索功能和A~Z字母索引栏,以便用户快速定位到特定联系人。在这个项目中...
仿Android联系人SideBar排序,根据拼音A-Z字母快速导航联系人姓名,以及输入搜索条件过滤,显示姓名的文字图片,添加挤压动画 ,http://blog.csdn.net/u010648159/article/details/50556909这是博客地址
这会触发适配器内部的过滤逻辑,将符合条件的联系人显示在ListView中。 在适配器的`filter()`方法中,我们首先备份原始数据,然后遍历所有联系人,检查姓名是否包含输入的关键词(或以关键词的拼音开头)。如果是,...
总的来说,“Android系统联系人全特效实现,分组导航和挤压动画demo”是一个深入实践Android联系人API、分组显示和动画效果的实例。开发者可以通过研究这个项目,学习如何高效地处理大量数据,实现流畅的动画效果,...
此外,对于SMS短信,你还可以实现短信拦截和过滤,通过创建并注册一个自定义的BroadcastReceiver监听ACTION_SMS_RECEIVED广播,然后在onReceive方法中根据需要决定是否阻止短信的显示或处理。这在防止垃圾短信或者...
在Android开发中,创建一个类似系统联系人菜单的界面是一项常见的任务,这通常涉及到复杂的UI设计和交互效果。本项目“Android 仿联系人菜单”实现了这样一个功能,它结合了字母索引、顶部挤压动画以及使用...
在Android平台上,实现从网络下载APK文件并自动执行安装是一个常见的需求,尤其在更新应用或者分发非市场应用时。这个过程涉及到多个步骤,包括网络请求、文件下载、权限处理以及安全检查。下面我们将详细讲解如何...
本文将详细探讨如何在Android应用程序中实现自动检查并下载新版本的代码逻辑,以达到无缝更新的效果。 首先,我们需要一个服务(Service)来执行后台的更新检查。这个服务会在合适的时机(例如应用启动时或网络连接...
这是Android开发的一个例子,作为学习SQLite的一个样板。使用Android SQLite数据库实现联系人的增删改查功能,同时使用了ListView、Adapter来实现数据的列表显示,使用SearchView与Filter数据过滤器来实现搜索功能。
本示例"联系人ListView实现"旨在模仿Android系统中的联系人应用界面,通过ListView来显示一系列联系人信息,提供用户友好的交互体验。这里我们将深入探讨如何在Android中实现这样的功能。 首先,我们需要了解...
在Android系统中,联系人应用(Contacts)是用户管理个人通信录的核心组件。Android 5.0(Lollipop)引入了许多新特性和优化,其中包括联系人应用的改进。本源码分析将深入探讨Android 5.0 Contacts的实现机制、核心...