android listview实现点击子项checkbox

1. 自定义一个类,存放Listview子项布局中的内容,其中最好包含一个boolean型变量用来记录checkbox是否被点击。

public class Line {
	private int image;
	private String big;
	private String name;
	private String nation;
	private boolean IsCheck;
	
	public int getImage() {
		return image;
	}
	public void setImage(int image) {
		this.image = image;
	}
	public String getBig() {
		return big;
	}
	public void setBig(String big) {
		this.big = big;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getNation() {
		return nation;
	}
	public void setNation(String nation) {
		this.nation = nation;
	}
	public Boolean getIsCheck() {
		return IsCheck;
	}
	public void setIsCheck(Boolean isCheck) {
		IsCheck = isCheck;
	}
}

2. 自定义ListView适配器,重写其中的getView()函数。

3. 将checkbox的监听函数放在getView()中。

//自定义ListView适配器
	class MyListAdapter extends BaseAdapter{
			private Context context;
			private List<Line> linelist;
									
			public MyListAdapter(Context context,List<Line> list){
				this.context = context;
		        this.linelist = list;		    		
	    	}
	
			@Override
			public int getCount() {
				// TODO Auto-generated method stub
				return linelist.size();
			}

			@Override
			public Object getItem(int arg0) {
				// TODO Auto-generated method stub
				return null;
			}

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

			@Override
			public View getView(final int position, View convertView, ViewGroup parent) {				
				final ViewHolder holder ;				
				if(convertView == null){					
					convertView = View.inflate(context, R.layout.item_row, null);
					
					holder = new ViewHolder();
					holder.pic = (ImageView)convertView.findViewById(R.id.imageView1);
					holder.selected = (CheckBox)convertView.findViewById(R.id.checkBox1);
					holder.name = (TextView)convertView.findViewById(R.id.name);
					holder.nation = (TextView)convertView.findViewById(R.id.nation);
					holder.big = (TextView)convertView.findViewById(R.id.big);
					
					convertView.setTag(holder);	
				}else{
					holder = (ViewHolder) convertView.getTag();
				}
				
				//holder.selected.setChecked(linelist.get(position).getIsCheck());
				holder.name.setText(linelist.get(position).getName());
				holder.nation.setText(linelist.get(position).getNation());
				holder.big.setText(linelist.get(position).getBig());
				holder.pic.setImageResource(linelist.get(position).getImage());
				
				// 判断checkbox的状态
		        if (linelist.get(position).getIsCheck()){
		            holder.selected.setChecked(true); // 选中
		        }else{
		            holder.selected.setChecked(false); // 未选中
		        }
		        
		        //checkbox监听函数
		        holder.selected.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
					
					@Override
					public void onCheckedChanged(CompoundButton buttonview, boolean ischecked) {
						// TODO Auto-generated method stub
						if(ischecked){
							Toast.makeText(context, "选中了"+linelist.get(position).getName(), Toast.LENGTH_LONG).show();
						}else{
							Toast.makeText(context, "取消了"+linelist.get(position).getName(), Toast.LENGTH_LONG).show();
						}
					}
				});
		
				
				return convertView;
			}
			
			static class ViewHolder{
		    	CheckBox selected;
		    	TextView name,nation,big;
		    	ImageView pic;
		}	
			
	}

4. 主类MainActivity中的listview的监听函数中最后一定要添加notifyDataSetChanged()。

import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	private ListView ll;
	private MyListAdapter adapter;
	private List<Line> lines;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		ll = (ListView) findViewById(R.id.ll);
		
		initData();
		adapter = new MyListAdapter(this,lines);
		
        ll.setAdapter(adapter);
        
        ll.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            int currentNum = -1;
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                for(Line line : lines){ //遍历lines集合中的数据
                	line.setIsCheck(false);//全部设为未选中
                }
                
                if(currentNum == -1){ //选中
                	lines.get(position).setIsCheck(true);
                    currentNum = position;
                }else if(currentNum == position){ //同一个item选中变未选中
                    for(Line line : lines){
                    	line.setIsCheck(false);
                    }
                    currentNum = -1;
                }else if(currentNum != position){ //不是同一个item选中当前的,去除上一个选中的
                    for(Line line : lines){
                    	line.setIsCheck(false);
                    }
                    lines.get(position).setIsCheck(true);
                    currentNum = position;
                }
                Toast.makeText(parent.getContext(),lines.get(position).getName(),Toast.LENGTH_SHORT).show();
                adapter.notifyDataSetChanged();//刷新adapter
            }
        });
		
		
	}
	
	
	//初始化数据
	private void initData() {
		String[] big = {"国家地理", "国家地理", "国家地理", "国家地理"};
	    String[] name = {"峡谷", "富士山", "山川", "雨林"};
	    String[] nation = {"英国", "日本", "新西兰", "巴西"};
	    int[] pic=new int[]{R.drawable.g1,R.drawable.g2, R.drawable.g3, R.drawable.g4};
	    
	    lines = new ArrayList<Line>();
		for (int i = 0; i < 4; i++) {
			Line line = new Line();
			line.setImage(pic[i]);
			line.setBig(big[i]);
			line.setName(name[i]);
			line.setNation(nation[i]);	
			lines.add(line);
	        }		
	 
	    }
				
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

最后效果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值