android的listview加checkbox实现单保存checkbox的勾选信息

最近做一个项目时想要增加安卓端的一个功能,就是增加一个activity上面有很多checkbox的勾选信息,然后可以给人选择多选框,看起来还算很简单。。但是真正做起来就有很多麻烦了。。

虽然我对安卓有点了解,以前也看过一些代码,但都是看别人的代码,看代码当然简单啦,这下要全部自己写,这下有点棘手了,一开始真是无从下手啊,后来去网上查了一下,觉得有个人的写法不错,就是用listview导入adapter的布局这样子,于是我就照着他的代码的原型开始改了起来。


改了N久,终于改的有点样子了,其中也花了很多精力呢!!所以趁热先记录下来,免得以后忘了,忘了再写的话那可是事倍工半呢!


我新添加的代码有四个文件,分别是Adapter.java,ListViewDemo,java,choice.xml,problem_item.xml这四个文件。


遇到的问题及解决方案:

1.新建的多选框选定以后跳转到别的界面后再次点入这个界面后以前的多选框信息不能保存,这样选择的信息就不能记录下来了。

解决方案:应用preference进行保存,将多选框选择信息写进了preference后下一次再次进入这个界面后就读取初始化信息来进行读取以前的记录信息。从而将多选框的记录勾上。


2.preference只能以键值对来保存,当这个activity有多个其他的信息框调用时,就会产生不能记录所有的多选框选择信息,举个例子,就好像有100个学生,你要为每个学生的类别进行多选框操作,比如说选择上课科目之类的,科目的哪个activity是一样的,但是数据不一样,这样你就需要保存多选框数据了,保存一个还好,但要保存每一个人的信息的话就需要动一番脑筋了。

解决方案:将每一个学生的ID发送到选择框activity,每次打开时读取对应学生ID对于的键值,因为多选框,所以有多个值,为了方便我就将全部的多选框转换为01字符串,0代表没有选中,1代表选中。然后再解析出是否被选中就可以了。


下面是相应功能代码,只供借鉴,不足望指出:


红线内为后来发现的小Bug!!

!!=================================================================================!!

软件总有Bug,需要不断改进,本来以为自己写的这个逻辑清楚,应该没有Bug,后来在测试的时候遇到了令人吐血的Bug,以至于后来在关键代码处每一行都加了Log来查看运行状态信息,后来终于发现程序的不足了。

Bug表现为当修改了多选框的长度后重新安装软件后,再次点开多选框界面会直接出错退出程序,原因是因为没有将前面一个版本的数据给清理掉,以至于读取数据的时候还是读的是以前的多选框的长度的字符数组,以至于将原来6个位的字符串赋给大于6个位的字符串,这样的话当然会报错了,这Bug让我想了好久。。


!!=================================================================================!!


Adapter.java

public class Adapter extends BaseAdapter{

	private ArrayList list;//填充数据的list
	private static HashMap isSelected;//用来控制checkBox的选中情况
	private Context context;//上下文
	private LayoutInflater inflater=null;//用来导入布局
	
	public Adapter(ArrayList list,Context context)//构造器
	{
		this.context = context;
		this.list = list;
		inflater = LayoutInflater.from(context); 
		isSelected = new HashMap(); 
		initDate();//初始化数据 
	}
	
	//初始化选择判断为false
	private void initDate()
	{
		for(int i=0;i getIsSelected() {  
        return isSelected;  
    }  
	
	public static void setIsSelected(HashMap isSelected) {  
        Adapter.isSelected = isSelected;  
    }  
	
	

ListViewDemo.java

public class ListViewDemo extends Activity {
	private ListView lv;  
    private Adapter mAdapter;  
    private ArrayList list;  
    private Button bt_selectall;  
    private Button bt_cancel;  
    private Button bt_deselectall;  
    private Button bt_yes;
    private int checkNum; // 记录选中的条目数量  
    private TextView tv_show;// 用于显示选中的条目数量  
    private int id;//消息编号,用来存储故障标号,从上一个界面传来
    private String defaul="";//默认的全部不勾选
    private String selectall="";//全部勾选
      
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.choice);  
        
        Intent i=getIntent();
		Bundle b=i.getBundleExtra("ID");
		id=b.getInt("id");
        
        /* 实例化各个控件 */  
        lv = (ListView)findViewById(R.id.list);  
        bt_selectall = (Button) findViewById(R.id.bt_selectall);  
        bt_cancel = (Button) findViewById(R.id.bt_cancelselectall);  
        bt_deselectall = (Button) findViewById(R.id.bt_deselectall);  
        bt_yes=(Button) findViewById(R.id.ok);
        tv_show = (TextView) findViewById(R.id.tv);  
        list = new ArrayList();  
         
        initDate();  
        
        //初始化勾选框信息,默认都是以未勾选为单位
    	for(int n=0;n arg0, View arg1, int arg2,  
                    long arg3) {  
                // 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤  
            	ViewHolder holder = (ViewHolder) arg1.getTag();  
                // 改变CheckBox的状态  
                holder.cb.toggle();  
                // 将CheckBox的选中状况记录下来  
                Adapter.getIsSelected().put(arg2, holder.cb.isChecked());   
                
             
            	//
                
                
                // 调整选定条目  
                if (holder.cb.isChecked() == true) {  
                    checkNum++;
 
                } else {  
                    checkNum--;  

                }  
                // 用TextView显示  
                //tv_show.setText("已选中"+checkNum+"项");  
                  
            }  
        });  
    }  
  
    //得到保存在这个activity中的数据
    public void getCheck()
    {
    	   	
    	SharedPreferences mPerferences=PreferenceManager.getDefaultSharedPreferences(this);//获取默认的preference
    	
    	//获取activity私有的preference
    	SharedPreferences m_private=this.getPreferences(MODE_PRIVATE);
    	String counter=mPerferences.getString(String.valueOf(id), defaul);//如果没有获取到的话默认是0
    	
    	for(int i=0;i

choic.xml


	 
    
    
    
     

problem_item.xml




    

    


ViewHolder.java

public class ViewHolder {  
    public TextView tv = null;  
    public CheckBox cb = null;  
}  

下面是选项的效果图

android的listview加checkbox实现单保存checkbox的勾选信息_第1张图片


你可能感兴趣的:(android)