Android 中listView数据混乱的原因以及解决方法

前几天写代码的时候,在listview 中添加了checkbox,原本觉着逻辑没有任何问题,但测试的时候,发现checkbox的状态是混乱的,

比如我这里选的1、2

等我再传进来的时候变成了

</pre><p></p><p><img src="" alt="" /></p><p>一开始不知道是为什么,后来网上搜索了一大堆之后,发现原来还是逻辑有些问题。</p><p><img src="" alt="" /></p><p>在这段代码里,</p><p></p><pre name="code" class="java">@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			final DeviceInfo item = items.get(position);
			ViewHolder holder=null;
			if(convertView==null){
				holder=new ViewHolder();
				convertView = inflater.inflate(R.layout.lv_item_device, null);
				holder.tvDeviceType=(TextView)convertView.findViewById(R.id.tv_device_type);
				holder.tvDeviceNo=(TextView)convertView.findViewById(R.id.tv_device_no);
				holder.cbIscheck=(CheckBox)convertView.findViewById(R.id.cb_device_ischeck);
				convertView.setTag(holder);
			}else{
				holder=(ViewHolder)convertView.getTag();
			}
			holder.tvDeviceType.setText(item.getDeviceCategory()+"");
			holder.tvDeviceNo.setText(item.getDeviceNum());
			holder.cbIscheck.setChecked(item.isSelcet());
			holder.cbIscheck.setOnCheckedChangeListener(new OnCheckedChangeListener() {
					@Override
					public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
						// TODO Auto-generated method stub
						item.setSelcet(isChecked);
					}
			});

			return convertView;
		}

先赋值,再设置监听器,就会出现一个问题,比如给第一个赋值了,此时它的item被赋值了,holder 还没有监听器,所以原先list就不会被触发。所以list中的数据就有可能因这段代码没生效:

holder.cbIscheck.setOnCheckedChangeListener(new OnCheckedChangeListener() {
					@Override
					public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
						// TODO Auto-generated method stub
						item.setSelcet(isChecked);
					}
			});

而不一致。

解决的办法很简单,将赋值放在监听器之后

如下:

		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			final DeviceInfo item = items.get(position);
			ViewHolder holder=null;
			if(convertView==null){
				holder=new ViewHolder();
				convertView = inflater.inflate(R.layout.lv_item_device, null);
				holder.tvDeviceType=(TextView)convertView.findViewById(R.id.tv_device_type);
				holder.tvDeviceNo=(TextView)convertView.findViewById(R.id.tv_device_no);
				holder.cbIscheck=(CheckBox)convertView.findViewById(R.id.cb_device_ischeck);
				convertView.setTag(holder);
			}else{
				holder=(ViewHolder)convertView.getTag();
			}
			holder.cbIscheck.setOnCheckedChangeListener(new OnCheckedChangeListener() {
					@Override
					public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
						// TODO Auto-generated method stub
						item.setSelcet(isChecked);
					}
			});
			holder.tvDeviceType.setText(item.getDeviceCategory()+"");
			holder.tvDeviceNo.setText(item.getDeviceNum());
			holder.cbIscheck.setChecked(item.isSelcet());

			return convertView;
		}

问题就解决了,总而言之,先做监听器,再赋值。

时间: 2024-11-07 10:42:28

Android 中listView数据混乱的原因以及解决方法的相关文章

3D商城服务器开发过程中遇到的问题,原因以及解决方法。。。

问题:???? 前端场景多出来一个或者几个"死人"(这个问题在中央服务器和好友服务器中可能同样存在,只是场景服务器的表现比较明显) 玩家进入场景的包流向如下:玩家客户端-->连接服务器-->中央服务器-->连接服务器--场景服务器 玩家离开场景的包流向如下:玩家客户端-->连接服务器-->场景服务器 原因:???? 1.客户端向服务器发送了两次进入场景的包 2.玩家刚发出进入场景的包之后立即断开与连接服务器的连接,此时进入场景服务器的包还停留在中央服务器,

Android中ListView的几种常见的优化方法

Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapter类,我们这里都继承自BaseAdapter,这里我们使用一个包含100个字符串的List集合来作为ListView的项目所要显示的内容,每一个条目都是一个自定义的组件,这个组件中只包含一个textview: Activity: package com.alexchen.listviewoptimi

android不生成R文件的原因与解决方法

1.默认SDK环境与引入的环境不一致引起的. 2. SDK有错误或找不到SDK引起的. 2. default.propites文件中定义的target=android-8与eclipse设置的不一致引起的. 3. 项目中有错误,xml文件错误,资源文件名不合法:有大写字符,数字开头,有空格等引起的. 1,当自己建立的工程没有出现R时,先clean一下,避免以前的错误. 2,重新build一下工程,如果一下不成,多build几下,会好点的. 3.想一想自已刚改过的地方是否有不合法的写法,或xml错

php教程之php空白页的原因及解决方法

php中出现空白页的原因及解决方法汇总. 很多程序员在进行php开发的时候都遇到过出现空白页的请,综合分析来说,在php编程中出现空白页面可能是由以下几个原因造成的: 1.逻辑错误逻辑错误是最难排除的,从表面上看,也许代码是合法的,是正规的,可运行起来却不是预料之中的.很多php教程中均有提及这方面的内容.为什么呢?也许是编写者想得不够全面,毕竟人是人,计算机是计算机,计算机不可能完全按照人的思路去运行脚本.一个比较好的调试方法,就是使用注释符“/* */”,注释掉一些代码,观察运行情况,以此来

Android中ListView滑动时数据混乱

相信做过Android应用开发的或多或少的都遇到过这样的问题,要不就是在ListView滑动时出现数据混乱,或者是GridView滑动时出现数据混乱.先来看看一位网友写的文章,个人感觉这篇文章挺不错的: Android ListView滑动过程中图片显示重复错位闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制. 1.原因分析 ListView item缓存机制:为了使得性能更优,ListView会缓存行i

Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

Android中ListView异步加载图片错位.重复.闪烁问题分析及解决方案 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如ListView上有100个Item,一屏只显示10个Item,我们知道getView()中convertView是用来复用View对象的,因为一个Item的对应一个View对象,而ImageView控件就是View对象通

Android中XML数据解析

转载请注明出处:http://blog.csdn.net/yegongheng/article/details/38296207 XML初步 今天我们来学习另一种非常重要的数据交换格式-XML.XML(Extensible Markup Language的缩写,意为可扩展的标记语言),它是一种元标记语言,即定义了用于定义其他特定领域有关语义的.结构化的标记语言,这些标记语言将文档分成许多部件并对这些部件加以标识.XML 文档定义方式有:文档类型定义(DTD)和XML Schema.DTD定义了文

Android中ListView字母排序,实现字母挤压效果以及右侧快速选中字母,搜索关键字功能

Android中ListView字母排序,实现字母挤压效果以及右侧快速选中字母,搜索关键字功能 本文中阐述如何自定义EditText实现搜索框自定义的样式以及挤压字母的思路等 自定义EditText 相关的drawable文件 主界面以及相关的适配器 结果展示 定义要呈现的EditText的样式 public class ClearEditText extends EditText implements OnFocusChangeListener, TextWatcher { /** * 定义删

67.Android中的数据存储总结

转载:http://mp.weixin.qq.com/s?__biz=MzIzMjE1Njg4Mw==&mid=2650117688&idx=1&sn=d6c73f9f04d02ede7a741b45e801d74e#rd 本篇文章会帮助大家快速了解Android中各种数据存储机制的应用场景以及基本使用方法,力求在头脑中建立一个“目录”.有了这个目录,具体使用细节在实际应用时再查询文档即可得到. 0. 概述 Android为我们提供了以下存储机制: Shared Preferenc