这两天无聊的时候突然想到过年短信群发的问题,直接群发短信别人收到了肯定不会有什么感觉,但是如果在短信的前面加上每个的名字,那么收短信的人肯定不会是觉得你在群发短信,因此我就想到了做这样一简单的应用,在短信的前面加上每个收信人的姓名,这里的收信人全部从联系人中选取。在联系人的选取界面是一个简单的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或者组件。