解决安卓开发中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

<pre name="code" class="java">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<Boolean> list_bool;
    private MyAdapter ma;
    private List<Map<String,String>> list =new ArrayList<Map<String,String>>();
    private SimpleAdapter sa =null;
    private ArrayList<Boolean> checked=new ArrayList<Boolean>();
	@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<Boolean>();
		for (int i = 0;i<MainActivity.list.size();i++){
			list_bool.add(false);
		}
		
		bt_ok = (Button)findViewById(R.id.button1);
		bt_ok.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				    Intent in=new Intent(BuyActivity.this,BuyingActivity.class);
				    BuyActivity.this.finish();
				    BuyActivity.this.startActivity(in);
				    
			}
		});
		
		
		bt_cancel = (Button)findViewById(R.id.button2);
		bt_cancel.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				BuyActivity.this.finish();
			}
		});
		
		lv =(ListView)findViewById(R.id.listView1);
	    ma = new MyAdapter(BuyActivity.this,R.layout.choose_buy,MainActivity.list);
	   	lv.setAdapter(ma);
	   	
	   	/*
		for (int i =0; i<MainActivity.tot_people;i++){
			Map<String,String> map = new HashMap<String,String>();
			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<String>{
		private int resource;    
		public MyAdapter(Context context,int resourceId, ArrayList<String> 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;
				}
			       
			}
	    	  
	     }
  
    }
	  
	    
}


 
</pre><pre name="code" class="java">
2.定义了checkbox的布局文件:

<?xml version="1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/myLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <CheckBox
        android:id="@+id/checkBox1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="0.42"
        android:text="CheckBox"
          />

</LinearLayout>

3.主Activity的布局文件:

<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/AbsoluteLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.Dropout.Four.BuyActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="13dp"
        android:layout_y="12dp"
        android:text="请选择参与本次消费的成员:" />

    <ListView
        android:id="@+id/listView1"
        android:layout_width="223dp"
        android:layout_height="312dp"
        android:layout_x="29dp"
        android:layout_y="38dp" >
    </ListView>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="53dp"
        android:layout_y="378dp"
        android:text="确定" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="168dp"
        android:layout_y="378dp"
        android:text="返回" />

</AbsoluteLayout>




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

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

抵扣说明:

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

余额充值