使用ListView,SimpleAdapter及CheckBox的心得

android 专栏收录该内容
13 篇文章 0 订阅

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


  • 3
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值