解决安卓开发中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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个基于Android Studio并使用Button、ListView、TextViewCheckBox和EditText控件安卓程序: 1. 在Android Studio,创建一个新的项目,选择Empty Activity模板。 2. 打开activity_main.xml布局文件,将界面布局设置为垂直方向。在布局文件添加一个EditText、Button、CheckBox、TextViewListView控件: ```xml <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter text here"/> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Add Item"/> <CheckBox android:id="@+id/checkBox" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Show text"/> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content"/> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> ``` 3. 在MainActivity.java,获取EditText、Button、CheckBox、TextViewListView控件的引用,并使用Adapter设置ListView的数据源。当用户点击Button时,添加一个新的数据项到ListView,如果CheckBox被选,则将EditText的文本显示在TextView。 ```java public class MainActivity extends AppCompatActivity { private EditText editText; private Button button; private CheckBox checkBox; private TextView textView; private ListView listView; private ArrayAdapter<String> adapter; private List<String> data; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = findViewById(R.id.editText); button = findViewById(R.id.button); checkBox = findViewById(R.id.checkBox); textView = findViewById(R.id.textView); listView = findViewById(R.id.listView); data = new ArrayList<>(); adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, data); listView.setAdapter(adapter); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String item = editText.getText().toString(); data.add(item); adapter.notifyDataSetChanged(); if (checkBox.isChecked()) { textView.setText(item); } } }); } } ``` 4. 运程序,测试ListView的添加功能、CheckBox的选状态以及EditText和TextView的文本显示功能。 以上就是一个基于Android Studio并使用Button、ListView、TextViewCheckBox和EditText控件安卓程序,您可以根据需要进修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值