這兩天無聊的時候突然想到過年短信羣發的問題,直接羣發短信別人收到了肯定不會有什麼感覺,但是如果在短信的前面加上每個的名字,那麼收短信的人肯定不會是覺得你在羣發短信,因此我就想到了做這樣一簡單的應用,在短信的前面加上每個收信人的姓名,這裏的收信人全部從聯繫人中選取。在聯繫人的選取界面是一個簡單的listview,其中每個條目有三個組件,第一個是checkbox用來選取其所在的聯繫人,後面兩個是textview分別用來顯示聯繫人的姓名和號碼。下面是實現的代碼
package com.example.myownmessage; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import com.example.service.ContactsInfo; import com.example.valuebean.People; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.CheckBox; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; import android.view.ViewGroup; public class ListContacts extends Activity { private CheckBox checkbox = null; private Button done = null; private ArrayList<People> groups = null; //將聯繫人對象也組成了一個數組 private ArrayList<String> names = new ArrayList<String>(); private ArrayList<String> numbers = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listcontacts); checkbox = (CheckBox)this.findViewById(R.id.check); done = (Button)this.findViewById(R.id.done); ListView list = (ListView) this.findViewById(R.id.list); ArrayList<Map<String,Object>> items = new ArrayList<Map<String,Object>>(); ContactsInfo info = new ContactsInfo(this); info.getAllContacts(); groups = info.getContactsGroup(); for(int i = 0 ; i < groups.size();i++){ Map<String,Object> listitem = new HashMap<String,Object>(); listitem.put("name",groups.get(i).getName()); listitem.put("number",groups.get(i).getNumber()); listitem.put("isSelected", groups.get(i).isSelected()); items.add(listitem); } SimpleAdapter adapter = new SimpleAdapter(this,items,R.layout.item,new String []{"isSelected","name","number"},new int[] {R.id.check,R.id.name,R.id.number}){ @Override public View getView(final int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); @SuppressWarnings("unchecked") final HashMap<String,Object> map = (HashMap<String, Object>) this.getItem(position); //獲取相應View中的Checkbox對象 CheckBox checkBox = (CheckBox)view.findViewById(R.id.check); checkBox.setChecked((Boolean) map.get("isSelected")); //添加單擊事件,在map中記錄狀態 //通過判斷checkbox是否被選中來確定聯繫人是否被放在names和numbers兩個數組中。 checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { map.put("isSelected", ((CheckBox)view).isChecked()); if(((CheckBox)view).isChecked()){ Toast.makeText(ListContacts.this,"選中了"+ map.get("name"), 0).show(); names.add((String) map.get("name")); numbers.add((String) map.get("number")); }else{ names.remove(map.get("name")); numbers.remove(map.get("number")); } } }); return view; } }; list.setAdapter(adapter); done.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { Intent intent = new Intent(); Bundle bundle = new Bundle(); bundle.putStringArrayList("names", names); bundle.putStringArrayList("numbers", numbers); intent.putExtra("data", bundle); ListContacts.this.setResult(200,intent);//將選擇結果返回給上一個activity ListContacts.this.finish(); }}); } }上面這段代碼最爲核心的就是自己構建了simpleadapter,並且重寫了它的的getView方法,在這個方法裏面爲checkbox添加了監聽器,當checkbox被選中的時候,將聯繫人的信息放進姓名和電話號碼的list裏面。
在完成這段代碼之前,我也查看了很多其他人的博客,現在也慢慢的理解了一部分。被重寫的getView方法它在什麼時候調用的呢?就是在每一次item從屏幕外滑進屏幕內的時候,或者程序剛開始的時候創建第一屏item的時候。因此爲每一個checkbox都註冊了監聽器,其中的參數ViewGroup parent 就是你設置adapter的那個組件裏面封裝一個viewGroup用來盛放item,position就是你選擇的 item的第幾條從0開始,convertView就是item上的佈局layout或者組件。