需求:把下列系統聯繫人的信息顯示在一個ListView上,當點擊listView子項時,把聯繫人的姓名和號碼返回到前一個activity,並顯示
效果圖
代碼實現
所需權限:android.permission.READ_CONTACTS
實體類Contact:
package cn.contactinfo; public class Contact { private String name; private String phone; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
主activity 也就是第一個界面
package cn.contactinfo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class ContactInfoActivity extends Activity { private Button btn_take; private TextView tv_show; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //找到相應的控件 btn_take = (Button) findViewById(R.id.btn_take); tv_show=(TextView) findViewById(R.id.tv_show); //爲button按鈕設置單擊事件 btn_take.setOnClickListener(new OnClickListener() { public void onClick(View v) { //實現activity的跳轉,並返回結果 Intent intent = new Intent(ContactInfoActivity.this,SecondActivity.class); //設置結果碼爲0 startActivityForResult(intent, 0); } }); } //返回結果必須要重寫onActivityResult()方法 protected void onActivityResult(int requestCode, int resultCode, Intent data) { //判斷data是否爲空 if(data!=null) { //判斷結果碼是否爲0 if (resultCode == 0) { //爲TextView設置文字 tv_show.setText(data.getStringExtra("content")); } } } }
ListView 界面
package cn.contactinfo; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; /** * 聯繫人列表activity * @author YSY */ public class SecondActivity extends Activity { ListView lv_second; List<Contact> contacts; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second); //獲取聯繫人信息 contacts = getContactInfo(); //找到相應的控件 lv_second=(ListView) findViewById(R.id.lv_second); //爲ListView設置適配器 lv_second.setAdapter(new MyAdapter(this,contacts)); //爲listView設置點擊事件,當點擊其某一子項時,需要把該子項的內容返回到上一個activity lv_second.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) { //獲取子項上聯繫人對象 Contact contact = (Contact) lv_second.getItemAtPosition(position); //獲取聯繫人的姓名和手機號 String content ="姓名:"+contact.getName()+ "手機號:"+contact.getPhone(); //創建Intent對象,來傳遞數據 Intent intent = new Intent(); intent.putExtra("content", content); //設置返回結果 setResult(0,intent); //關閉當前的activity finish(); } }); } /** * 獲取系統聯繫人信息(核心內容) * @return Contact集合 */ public List<Contact> getContactInfo() { //創建一個list集合,裏面的對象都是Contact List<Contact> contacts = new ArrayList<Contact>(); //獲得一個ContentResolver的實例,可通過Activity的成員方法getContentResovler()方法,用於查詢數據用 //ContentResolver參考網址http://blog.sina.com.cn/s/blog_8ce4eca801010qk5.html ContentResolver resolver = getContentResolver(); //創建兩個Uri對象 Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); Uri dataUri = Uri.parse("content://com.android.contacts/data"); //調用ContentResolver對象的query方法,進行數據查詢 返回一個Cursor對象 Cursor cursor = resolver.query(uri, null, null, null, null); //此處需要一個雙層循環,來實現查找聯繫人姓名和號碼 //(外層循環)循環cursor 取出查找所用字段"_id" while(cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("_id")); Cursor dataCursor = resolver.query(dataUri, null, "raw_contact_id = ?", new String[]{String.valueOf(id)}, null); Contact contact = new Contact(); //內存循環,循環data1和mimetype兩個字段內容 while(dataCursor.moveToNext()) { String data = dataCursor.getString(dataCursor.getColumnIndex("data1")); String mimetype = dataCursor.getString(dataCursor.getColumnIndex("mimetype")); //如果mimetype是手機號,就把data數據放到contant中 if("vnd.android.cursor.item/phone_v2".equals(mimetype)) { contact.setPhone(data); //如果mimetype是姓名,就把data數據放到contant中 }else if("vnd.android.cursor.item/name".equals(mimetype)){ contact.setName(data); } } //每循環一次就把一個contant(聯繫人)對象存放到contacts集合當中 contacts.add(contact); //關閉dataCursor dataCursor.close(); } //關閉cursor cursor.close(); return contacts; } /** * 自定義adapter * @author YSY * */ public class MyAdapter extends BaseAdapter { Context context; List<Contact> contacts; public MyAdapter(Context context,List<Contact> contacts) { this.contacts=contacts; this.context=context; } public int getCount() { return contacts.size(); } public Object getItem(int position) { return contacts.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { Holder holder = null; if(convertView==null) { holder = new Holder(); convertView = View.inflate(SecondActivity.this, R.layout.item, null); holder.tv_name = (TextView) convertView.findViewById(R.id.tv_name); holder.tv_phone = (TextView) convertView.findViewById(R.id.tv_phone); convertView.setTag(holder); } else { holder = (Holder)convertView.getTag(); } holder.tv_name.setText(contacts.get(position).getName()); holder.tv_phone.setText(contacts.get(position).getPhone()); return convertView; } public class Holder { private TextView tv_name; private TextView tv_phone; } } }
如果親們對於ContentResolver還不是很理解的,可以參考網址http://blog.sina.com.cn/s/blog_8ce4eca801010qk5.html
希望這個能幫助各位,來實現此功能。