`

关于ListView中加入并选取checkbox错位的问题

阅读更多
Android ListView CheckBox状态错乱
http://www.cnblogs.com/wujd/archive/2012/08/17/2635309.html

在ListView中的列表项中定义checkbox是一个常见手法,不过如果在listview使用了ViewHolder缓存的话就会遇到一个很恶心的问题,就是列表项错位的问题,为此我想到了一个自认为还算简单的解决方法,就是在自定义Adapter时加入checkbox.setTag(position)这样一句代码。这里checkbox为当前列表项的复选框,position为当前列表项位置。然后为checkbox设置点击事件,checkbox.setOnClickLinster(this)。最后在onClick(View v)方法中通过switch(v.getTag()){case 1: .......}方式设置点击事件

我的解决方法:
引入一个ArrayList<Boolean>列表,记录每一项当前的状态,然后在getView()中这样使用:holder.checkBox_3.setChecked(checkPosition_3.get(position));
具体看下面:

private List<Boolean> checkPosition_3,checkPosition_1,checkPosition_0;
 class ListViewAdapter extends BaseAdapter{
    	private Context context;
    	public ListViewAdapter(Context context){
    		this.context=context;
    		checkPosition_3 = new ArrayList<Boolean>(ITEMS);
    		checkPosition_1 = new ArrayList<Boolean>(ITEMS);
    		checkPosition_0 = new ArrayList<Boolean>(ITEMS);
    		for(int i=0;i<ITEMS;i++){
    			checkPosition_3.add(false);
    			checkPosition_1.add(false);
    			checkPosition_0.add(false);
    		}
    	}
		public int getCount() {
			// TODO Auto-generated method stub
			return model.getItems().size();
		}

		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return model.getItems().get(position);
		}

		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@Override
		public boolean isEnabled(int position) {
			// TODO Auto-generated method stub
			return false;
		}
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			final ViewHolder holder;
			if(convertView==null){
				holder=new ViewHolder();
				convertView=LayoutInflater.from(context).inflate(R.layout.simple_list_item_zc14or9, null);
				holder.serial = (TextView)convertView.findViewById(R.id.serial);//序号
				holder.SS = (TextView)convertView.findViewById(R.id.SS);//赛事
				holder.ZDandKD = (TextView)convertView.findViewById(R.id.ZDandKD);//主队 VS 客队
				holder.BSSJ = (TextView)convertView.findViewById(R.id.BSSJ);//比赛时间
				
				holder.checkBox_3 = (CheckBox)convertView.findViewById(R.id.checkBox_3);//
				holder.checkBox_1 = (CheckBox)convertView.findViewById(R.id.checkBox_1);//
				holder.checkBox_0 = (CheckBox)convertView.findViewById(R.id.checkBox_0);//
				
				convertView.setTag(holder);
			}else{
				holder = (ViewHolder) convertView.getTag();
			}
			ZC instance=model.getItems().get(position);
			
			holder.serial.setText(instance.serial);
			holder.SS.setText(instance.SS);
			holder.ZDandKD.setText(instance.ZD+" VS "+instance.KD);
			holder.BSSJ.setText(instance.BSSJ);
			
			//为了解决关于ListView+CheckBox,Item超过一屏时数据错乱
			holder.checkBox_3.setId(position); 
			holder.checkBox_3.setChecked(checkPosition_3.get(position));
			holder.checkBox_3.setOnCheckedChangeListener(new OnCheckedChangeListener(){

				public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
					// TODO Auto-generated method stub
					int id = buttonView.getId();
					checkPosition_3.set(id,isChecked); //赋值
					updateTextViewInfo();
				}
				
			});
			holder.checkBox_1.setId(position); 
			holder.checkBox_1.setChecked(checkPosition_1.get(position));
			holder.checkBox_1.setOnCheckedChangeListener(new OnCheckedChangeListener(){
				
				public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
					// TODO Auto-generated method stub
					int id = buttonView.getId();
					checkPosition_1.set(id,isChecked); //赋值
					updateTextViewInfo();
				}
				
			});
			holder.checkBox_0.setId(position); 
			holder.checkBox_0.setChecked(checkPosition_0.get(position));
			holder.checkBox_0.setOnCheckedChangeListener(new OnCheckedChangeListener(){

				public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
					// TODO Auto-generated method stub
					int id = buttonView.getId();
					checkPosition_0.set(id,isChecked); //赋值
					updateTextViewInfo();
				}
				
			});
			return convertView;
		}
    	
		class ViewHolder {
			TextView serial;//序号
			TextView SS;//赛事
			TextView ZDandKD;//主队 VS 客队
			TextView BSSJ;//比赛时间
			
			CheckBox checkBox_3,checkBox_1,checkBox_0;
        }
		
    }

我这里一个Item里面有3个CheckBox,所以有三个ArrayList<Boolean>列表。





如果在ListView中存在EditText的话,也会存在错乱问题。
解决方法http://blog.sina.com.cn/s/blog_80f8936801012cp7.html
虽然也不那么优美!

ListView用CHOICE_MODE_MULTIPLE属性实现多选
http://blog.csdn.net/pengkv/article/details/47151023
  • 大小: 332.8 KB
分享到:
评论
1 楼 mfkxk298 2014-09-03  
很好很强大!让我绕过了逻辑怪圈,非常感谢!

相关推荐

    ListView的CheckBox错位Demo

    分析这个Demo,我们可以学习如何处理ListView中CheckBox的错位问题,同时理解Adapter的复用机制和事件监听的使用。 总结起来,解决ListView中CheckBox错位的问题需要深入理解ListView的工作原理,正确使用Adapter的...

    ListView中添加CheckBox

    1、ListView item中加入checkbox后onListItemClick 事件无法触发。 原因:checkbox的优先级高于ListItem于是屏蔽了ListItem的单击事件。 解决方案:设置checkbox的android:focusable="false" 2、选择其中的...

    Listview图片错位+CheckBox选项错位

    总的来说,解决ListView中的图片错位和CheckBox错位问题,关键在于理解其工作原理,合理使用缓存和状态管理,以及优化布局设计。通过实践和调试,我们可以确保ListView呈现出整洁、一致的用户体验。在提供的`...

    CheckBox+ListView混合使用,并缓存

    CheckBox+ListView混合使用,并缓存CheckBox+ListView混合使用,并缓存CheckBox+ListView混合使用,并缓存CheckBox+ListView混合使用,并缓存CheckBox+ListView混合使用,并缓存CheckBox+ListView混合使用,并缓存...

    WPF ListView控件中CheckBox全选联动

    在实际项目中,我们经常需要实现一个功能,即在ListView中加入CheckBox,让用户能够通过一个主CheckBox来控制所有子项CheckBox的选择状态,这就是所谓的全选/反选联动。在本文中,我们将深入探讨如何在WPF的MVVM...

    delphi中listview启用checkbox实现单选

    在Delphi编程环境中,ListView控件是一个非常常用的组件,它允许开发者展示列表数据,并提供了多种交互方式,如单击、双击以及复选框选择。本文将深入探讨如何在Delphi中启用ListView的复选框并实现单选功能,特别...

    Android完美解决ListView复用导致的Checkbox状态混乱问题

    然而,ListView的复用机制有时会导致一些问题,特别是在涉及复选框(Checkbox)的状态管理时。本篇文章将详细探讨这个问题,并提供一个完美的解决方案。 一、问题背景 ListView通过ViewHolder模式实现高效的滚动...

    listview中添加CheckBox的完美实现

    然而,添加 CheckBox 到 ListView 中并不是一件简单的事情,因为它需要解决事件冲突和复用错误的问题。 在本文中,我们将实现一个完美的 ListView 中添加 CheckBox 的解决方案。这个解决方案可以将 ListView 子项中...

    ListView和CheckBox错位(解决)

    要解决这个错位问题,我们需要理解ListView的工作原理和复用机制。ListView通过重用已滑出屏幕的视图来提高性能,当用户滚动时,不再显示的Item会被重新使用来显示新的数据。因此,我们需要确保每次更新数据时,对...

    WPF中ListView添加CheckBox列

    在实际的应用场景中,我们经常需要在ListView中添加可选的复选框(CheckBox)列,以便用户能够选择一个或多个项目。本文将详细探讨如何在WPF的ListView中实现这一功能。 首先,我们需要理解WPF中的数据绑定机制。在...

    c# ListView CheckBox 索引值

    总的来说,要获取C# ListView中CheckBox的索引值,我们需要在ListView控件上启用多选并添加CheckBox列,然后监听`ItemChecked`事件来获取选中项的索引,或者通过遍历所有项来获取所有选中项的索引。以上步骤可以帮助...

    ListView添加CheckBox复选框

    在Android开发中,ListView是一...以上就是关于在Android中如何在ListView中添加CheckBox实现多选功能的详细讲解。实际开发中,还可以根据需求对这一功能进行扩展,例如添加滑动选择、长按选择等特性,以提升用户体验。

    listview中添加checkbox实现多选操作问题

    本文将详细讲解如何在ListView中集成Checkbox并实现这些功能。 首先,我们需要创建一个自定义的ListView适配器。这个适配器通常继承自BaseAdapter,它负责将数据绑定到ListView的每一项视图上。适配器的核心方法...

    完美解决ListView和CheckBox的焦点冲突及CheckBox的复用问题

    然而,当ListView中的元素包含可交互的控件,如CheckBox时,会遇到一些常见问题,如焦点冲突和视图复用导致的显示异常。本文将详细探讨这些问题以及如何通过优化来实现“完美解决ListView和CheckBox的焦点冲突及...

    解决ListView嵌套CheckBox滑动时选中状态错乱

    然而,当ListView内部嵌套CheckBox等可交互组件时,常常会遇到一些问题,特别是滑动过程中选中状态错乱的现象。这个问题主要是由于ListView的复用机制导致的,即ListView在滚动时会复用已滑出屏幕的列表项,如果不...

    CheckBoxListView

    总的来说,CheckBoxListView是Android开发中一个实用的组件,它通过优化选择逻辑和处理图片错位问题,提升了用户在列表中的选择体验。理解和掌握这种实现方式对于提升Android应用的用户体验和开发技能非常有帮助。

    带下拉刷新的ListView的中同时处理CheckBox,Button,和item事件

    在ListView中,我们经常会遇到需要处理多种交互元素,如CheckBox、Button等,这涉及到事件分发和回调机制。以下是对这个主题的详细解释。 ### 1. ListView的基本使用 ListView通过Adapter将数据绑定到视图上。...

    Listview+Edittext和ListView+CheckBox

    本话题主要探讨如何在ListView中集成EditText和CheckBox,以实现更具交互性的功能。 1. **ListView基础**: - ListView是一个可滚动的视图,通常用于显示一组项目,每个项目由一个View或一个ViewGroup表示。 - 它...

    android listview 异步加载图片并防止错位

    "android listview 异步加载图片并防止错位"这个主题就是针对这些问题提出的一种解决方案。 异步加载图片是为了避免在主线程中执行耗时操作,导致UI卡顿。通常,我们使用异步任务(如AsyncTask)或者专门的图片加载...

    ListView带CheckBox 你懂的

    "ListView带CheckBox"的主题,主要涉及如何在ListView的每个列表项中集成CheckBox,并处理滑动过程中可能出现的选中状态错乱问题,以及实现全选、反选等高级功能。下面将详细介绍这些关键知识点。 1. **自定义...

Global site tag (gtag.js) - Google Analytics