android项目 之 来电管家(2) ----- ListView+CheckBox的使用

上一节,已经完成了来电管家的界面设计,那么下面就要实现具体的功能了,如何将添加的黑白名单显示呢?这里用到了ListView,那么,如果需要删除黑白名单呢,是一个个长按弹出菜单删除,还是将所的黑白名单清空呢,这都不符合用户的需求,往往,都是删除多个,这就有个问题了,如何在ListView中删除指定的多个item呢??可能大家想到了,要用到CheckBox。

先看图:

可以看出,当处于删除模式时,底部按钮也变成了删除与返回,中间也显示了当前共选择了多少项,而且在ListView的每一个Item右边也显示出了CheckBox,用于多选。

这一节,只实现如何显示,并且为ListView添加监听器,下节再实现的黑白名单的增加与删除。

黑白名单的布局文件上一节已给出,既然用到了ListView,必然要有Adapter,这里依然采用的是BaseAdapter,主要代码如下:

 class Adapter extends BaseAdapter{
        private Context context;
        private LayoutInflater inflater=null;
        private HashMap<Integer, View> mView ;
        public  HashMap<Integer, Integer> visiblecheck ;//用来记录是否显示checkBox
        public  HashMap<Integer, Boolean> ischeck;
        private TextView txtcount;

        public Adapter(Context context,TextView txtcount)
        {
            this.context = context;
            this.txtcount = txtcount;
            inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            mView = new HashMap<Integer, View>();
            visiblecheck = new HashMap<Integer, Integer>();
            ischeck      = new HashMap<Integer, Boolean>();
            if(isMulChoice){
                for(int i=0;i<array.size();i++){
                    ischeck.put(i, false);
                    visiblecheck.put(i, CheckBox.VISIBLE);
                }
            }else{
                for(int i=0;i<array.size();i++)
                {
                    ischeck.put(i, false);
                    visiblecheck.put(i, CheckBox.INVISIBLE);
                }
            }
        }

        public int getCount() {
            // TODO Auto-generated method stub
            return array.size();
        }

        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return array.get(position);
        }

        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }

        public View getView(final int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            View view = mView.get(position);
            if(view==null)
            {
                view = inflater.inflate(R.layout.list_item, null);
                TextView id = (TextView)view.findViewById(R.id.tv_id);
                TextView name = (TextView)view.findViewById(R.id.tv_name);
                TextView number = (TextView)view.findViewById(R.id.tv_number);
                final CheckBox ceb = (CheckBox)view.findViewById(R.id.cb_choose);

                Person p = array.get(position);
                id.setText(p.id+"");
                name.setText(p.name);
                number.setText(p.number);

                ceb.setChecked(ischeck.get(position));
                ceb.setVisibility(visiblecheck.get(position));

                view.setOnLongClickListener(new Onlongclick());

                view.setOnClickListener(new OnClickListener() {

                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        if(isMulChoice){
                            if(ceb.isChecked()){
                                ceb.setChecked(false);
                                selectid.remove(array.get(position));
                            }else{
                                ceb.setChecked(true);
                                selectid.add(array.get(position));
                            }

                            txtcount.setText("共选择了"+selectid.size()+"项");
                        }else {
                            //Toast.makeText(context, "点击了"+array.get(position), Toast.LENGTH_LONG).show();
                        }
                    }
                });

                mView.put(position, view);
            }
            return view;
        }
        class Onlongclick implements OnLongClickListener{

            public boolean onLongClick(View v) {
                // TODO Auto-generated method stub

                isMulChoice = true;
                selectid.clear();
                add_layout.setVisibility(View.GONE);
                delete_layout.setVisibility(View.VISIBLE);
                for(int i=0;i<array.size();i++)
                {
                    adapter.visiblecheck.put(i, CheckBox.VISIBLE);
                }
                adapter = new Adapter(context,txtcount);
                lv_show.setAdapter(adapter);

                return true;
            }
        }

    }

其中的Onlongclick是给ListView的item添加长按监听器,实现弹出CheckBox,及底部删除按钮的功能。这里面用到了控件的隐藏与显示,剩下的就是控件的声明与定义。并为ListView绑定监听器。

	private List<Person> array = new ArrayList<Person>();
    	private List<Person> selectid = new ArrayList<Person>();
	private ListView lv_show;
	private CheckBox cb;
	private TextView tv_count;
	private RelativeLayout add_layout;
	private RelativeLayout delete_layout;
	private Adapter adapter;

其中Person是自定义的类:

Person.java

public class Person {
	 String name;
	 String number;
	 int id;
	public Person(int id,String name,String number) {
		this.id = id;
		this.name = name;
		this.number = number;
	}
}
    tv_count = (TextView)findViewById(R.id.tv_select);
    add_layout = (RelativeLayout)findViewById(R.id.add_layout);
    delete_layout = (RelativeLayout)findViewById(R.id.delete_layout);
    lv_show = (ListView)findViewById(R.id.lv_show);

这里只是主要的代码,完整的代码我会打包上传的。

时间: 2024-11-05 13:50:28

android项目 之 来电管家(2) ----- ListView+CheckBox的使用的相关文章

android项目 之 来电管家(1) ----- 界面设计

因为需要,最近几天忙着写来电管家这个小软件,现在已经基本写的差不多了,基本的功能也都已实现,就剩下后续的完善了,而之前的记事本项目最近几天没写,但是肯定还是会完成的. 来电管家的基本功能,这里主要做的是拦截. 1.    添加黑白名单 2.    选择拦截模式 3.    启用拦截时间段 4.    拦截开关 主要功能,就是通过用户选择开启拦截,并选择拦截模式,这时就会启动后台监听服务,监听来电,判断是否挂断,并且,用户可以自由选择拦截时间段,也就是在该时间段内才启用监听服务. 先来看界面:  

android项目 之 来电管家(5) ----- 添加监听服务

上面四节,已经实现了界面设计,黑名单(白名单的添加与删除与黑名单同理,不再赘述),启用监听开关,定时拦截开关,及拦截模式选择等功能,下面就要实现来电管家最核心的功能,也就是拦截功能.   主要思路: 1.  制定拦截模式,这里主要有两个,一个是黑名单模式,也就是只拦截在黑名单中的号码:另一个就是白名单模式,拦截除了白名单以外的号码. 2.  根据用户自定义设置信息,制定正则表达式,判断拦截的标准. 3.  使用对应的类实现挂断电话的功能. 监听模块主要是利用service实现功能,为了实现电话挂

android项目 之 来电管家(8) ----- 添加开机自启动监听服务

现在大多数的应用都会开机自启动,来电管家更是如此,添加了开机自启动监听服务后,开机后即使你没有打开来电管家应用程序,一样可以拦截来电信息. 开机自启动Activity或Service的方法: 主要步骤: 1.  要有开机要启动的service或activity(这里开机要启动的当然就是ListenService了) 2. 编写一个BroadcastReceiver用以捕获ACTION_BOOT_COMPLETED这条广播,并在捕获之后启动我们要启动的Activity或service. BootC

android项目 之 来电管家(7) ----- 加载用户设置并启监听用服务

因为我们用的是SharedPreferences来存储用户设置信息,那么在初次进入来电管家时,会有一些默认的设置,后续根据用户的设置,更新设置信息文件的内容. 打开应用程序,首先启动的是ActivityGroupDemo,并默认显示黑名单界面,这时,需要在ActivityGroupDemo.java中添加代码,判断用户是否是第一次进入该应用,如果是第一次,则写入默认的设置信息. 这里判断用户是否为第一次进入该应用程序,采用的思路为: 1)因为SharedPreferences会在应用程序目录下的

android项目 之 来电管家(3) ----- 添加与删除黑名单

现在就实现具体的功能-----添加黑名单 先看图: 从图中也可以看出整个逻辑,就是: 1.  点击底部的添加按钮 2.  转到联系人选择界面选择联系人(这里调用的是系统的联系人界面,每次只能选择一个联系人,当然了,要实现每次选择多个联系人也可以,可以自定义选择联系人界面) 3. 返回选择的联系人并插入到数据库中. 4. 遍历数据库中的黑名单表,将所有的黑名单显示在ListView中 5. 删除联系人 6. 刷新黑名单显示列表 主要代码(BlackListActivity.java): priva

android项目 之 来电管家(4) ----- 添加拦截时间段

在大多数的骚扰拦截类的软件中都会有定时拦截这个实用的的功能,其实,也不难实现. 看图: 在未选中启用时间段时,下面的两个开始时间和结束时间呈灰色状态,并且单击无响应,启用时间段后,下面则变成了可以单击的状态,通过单击可以弹出选择日期与时间的对话框,用于选择开始时间和结束时间. 主要思路: 1.  启用时间段,将下面的控件变成可获得焦点状态 2.  添加单击事件,弹出日期时间选择对话框 3.  选择时间,并显示在相应的位置 4.  通过SharedPrefresence将相关设置保存,以便下次启动

android 项目学习随笔十七(ListView、GridView显示组图)

ListView.GridView显示组图,处理机制相同 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="w

Android ListView CheckBox状态错乱(转)

转自:http://www.cnblogs.com/wujd/archive/2012/08/17/2635309.html listView中包含checkBox的时候,经常会发生其中的checkBox错乱的问题,大多时候的代码如下: 先看一下效果图:奇数行为选中状态,偶数行为非选中状态 具体代码: 布局文件: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:andro

android listview + checkbox 列表上下滑动导致复选框状态丢失解决办法

以前为这个问题头疼很久.然后去忙其他事情.一直没有去整理,今天好不容易闲下来.就来整整这个listview + checkbox的问题吧 界面: listview_cell: 界面很简单,一个全屏的listview,cell很简单,一个textview一个checkbox activity: package com.example.testlistviewandcheckbox; import java.util.ArrayList; import java.util.List; import