Android的ListView中给RadioGroup添加setOnCheckChangeListener的问题之一

作为我在博客的第一篇文章,我觉得我得认认真真的写一下。

一直也没想到好的原创文字,所以一直也没写过,觉得草率的写出来会让人看了笑话。幸好今天给了我一个机会。

今天在公司做项目的时候遇到了一个我之前遇到过的问题,就是ListView中监听事件的问题。这次用了一个RadioGroup在LisView中,然后给RadioGroup加了一个监听事件,监听当选项改变的时候进行一些流程的处理。

然后问题就来了,当第一次跳转到这个页面的时候,我就发现了一些问题,因为我重写了监听方法,为了传holder进去,对其他的控件进行改变。说道这里还是先说一下这个监听是怎么重写的吧。

都是我基础不扎实,问了前辈,前辈虽然不是搞Android的,但是对Java有多年的编程经验,公司老一辈的人物,公司现在用的框架都是当年一手实现出来的,扯偏了~回到正题,前辈看了我的代码,大手一挥,说这个是可以重构的,然后就在我的“指导”下帮我写了监听方法,上监听方法:

public class MyRadioChangeListener implements OnCheckedChangeListener {
	ViewHolder myHolder;
	
	public MyRadioChangeListener(ViewHolder holder){
		myHolder = holder;
	}
	@Override
	public void onCheckedChanged(RadioGroup group, int checkedId) {
		// TODO Auto-generated method stub

	}

}
看起来很简单吧,又学了一招!

就是因为我在这个监听里写了一些对事件的处理:

public class MyRadioChangeListener implements OnCheckedChangeListener {
	
	ViewHolder myholder;

	public MyRadioChangeListener(ViewHolder holder){
		
		myholder = holder;
		
	}
	
	@Override
	public void onCheckedChanged(RadioGroup group, int checkedId) {
		if(checkedId==myholder.radiostart.getId()){
			LogUtils.e("MyRadioChangeLisener", "1");
			
		}
		if(checkedId==myholder.radiopause.getId()){
			LogUtils.e("MyRadioChangeLisener", "2");
			
		}
		if(checkedId==myholder.radiostop.getId()){
			LogUtils.e("MyRadioChangeLisener", "0");
			
		}
	}
}
里面的LogUtils方法是我自定义的,是从别的地方学来的,这里就不贴代码了。

我运行了程序,点到有ListView的页面,问题就出来了,我我还没开始选呢,这三个LogUtils就依次输出来了,我瞬间就纳闷了,为啥会出这个问题咧,想了一会,也请教了几个人,都没能给我答案,可能我当时表述的不是很清楚吧。

开始分析:

1、这是一个监听事件,在条件满足时才会触发;

2、现在事件触发了,是什么地方满足了它的触发条件呢?

3、这个监听事件是对RadiGroup的监听,

holder.radioGroup.setOnCheckedChangeListener(newMyRadioChangeListener(holder));

从字面上理解就是当选择改变的时候就会触发这个监听事件。

下面来看一张图,是这个ListView的初步草图:
Android的ListView中给RadioGroup添加setOnCheckChangeListener的问题之一_第1张图片

从图中就可以看出来一个问题,就是当绘制第二个item的时候,RadioGroup的选项改变了,他改变了,因此,这就是触发条件,因为是复用的convertView,因此给RadioGroup的监听事件一直存在,存在!当绘制第二个item的时候就会触发第一次的事件,第三次触发第二次的····然后,这就是问题了。

问了几个人,好像他们并没有遇到过这个问题,也许是我的描述不太清楚,并没有好的建议给我,然后就一直思考,想了老半天,终于想到了一个方法,那就是每次给控件赋值,添加事件的时候把这个监听给设为空,然后就有了这么一句:

holder.radioGroup.setOnCheckedChangeListener(null);

就成这样了

			holder.radioGroup.setOnCheckedChangeListener(null);
			final HashMap map = _mList.get(position);
			holder.control_name.setText(map.get("name"));
			if(map.get("state").equals("0")){
				holder.radioGroup.check(R.id.radioStop);
				
			}
			if(map.get("state").equals("1")){
				holder.radioGroup.check(R.id.radioStart);
				
			}
			if(map.get("state").equals("2")){
				holder.radioGroup.check(R.id.radioPause);
				
			}
			holder.radioGroup.setOnCheckedChangeListener(
					new MyRadioChangeListener(holder));
到此,问题就彻底的解决了。问题好像也不是很难,一开始想了半天没想出来,还百度了好久也没找到,博客里也没有相关的例子,幸好解决了,要不又要浪费好多时间,这里写出来分享一下。

好像写的也并不是很好,没有啥文采,看来需要多多练习啊,以后多写点博客。


你可能感兴趣的:(Android)