解决安卓开发中listview与checkbox等控件一起使用的问题

之前做一个个人项目的时候在listview中加入了checkbox控件,但是发现选择一个checkbox之后,其余某个checkbox也会被选择,经过6个小时的努力终于解决了这个问题。


要解决这个问题我们就要了解首先安卓的listview是有缓存和复用机制的,关于这点如果不了解的话可以点击这个链接,里面有浅显易懂的解释:

http://blog.csdn.net/lovehong0306/article/details/7498025

(注意:这个链接是转载的,感谢原作者)


之所以会出现checkbox之间选择之后相互关联就是因为这个复用机制再捣乱。


所以现在我们要做的就是手动的保存下每个checkbox是否被选择的状态,当系统调用getView显示checkbox的时候通过我们自己保存下的状态来决定checkbox应该被设置选中还是未选中。在代码中我选择使用ArrayList来保存checkbox的选中状态。


下面是代码:

1.主activity

package com.Dropout.Four;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.appcompat.R.integer;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class BuyActivity extends Activity {
	private Button bt_ok;
    private Button bt_cancel;
    private ListView lv; 
    public static ArrayList list_bool;
    private MyAdapter ma;
    private List> list =new ArrayList>();
    private SimpleAdapter sa =null;
    private ArrayList checked=new ArrayList();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_buy);
		for(int i=0;i<(MainActivity.list).size();i++){
			checked.add(false);
		}
		
		
		//初始化list_booli
		list_bool = new ArrayList();
		for (int i = 0;i map = new HashMap();
			map.put("name",MainActivity.list.get(i));
			list.add(map);
		}
		sa = new SimpleAdapter(this,
				list,
				R.layout.choose_buy,
				new String[]{"name"},
		        new int[]{R.id.checkBox1});
		lv.setAdapter(sa);    
	    */
		
		
	}
	


	  private class MyAdapter extends ArrayAdapter{
		private int resource;    
		public MyAdapter(Context context,int resourceId, ArrayList s) {
			super(context,resourceId,s);
			resource = resourceId; 
		}
		
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if(convertView==null){
				convertView=BuyActivity.this.getLayoutInflater().inflate(R.layout.choose_buy, null);
			}
			CheckBox cb = (CheckBox)convertView.findViewById(R.id.checkBox1);
			cb.setText(MainActivity.list.get(position));
			cb.setChecked(checked.get(position));
			cb.setOnClickListener(new MyListener(position));
			return convertView;
	     }
		
		private class MyListener implements OnClickListener{
			private int key;
			public MyListener(int key){
				this.key=key;
			}
			@Override
			public void onClick(View v) {
				// TODO 自动生成的方法存根
				if(!checked.get(key)){
				checked.set(key,true);
				return;
				}
				if(checked.get(key)){
					checked.set(key,false);
					return;
				}
			       
			}
	    	  
	     }
  
    }
	  
	    
}


 
  
2.定义了checkbox的布局文件: 
  




    


3.主Activity的布局文件:



    

    
    

    

解决安卓开发中listview与checkbox等控件一起使用的问题_第1张图片


你可能感兴趣的:(解决安卓开发中listview与checkbox等控件一起使用的问题)