作为我在博客的第一篇文章,我觉得我得认认真真的写一下。
一直也没想到好的原创文字,所以一直也没写过,觉得草率的写出来会让人看了笑话。幸好今天给了我一个机会。
今天在公司做项目的时候遇到了一个我之前遇到过的问题,就是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));
从字面上理解就是当选择改变的时候就会触发这个监听事件。
从图中就可以看出来一个问题,就是当绘制第二个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));
到此,问题就彻底的解决了。问题好像也不是很难,一开始想了半天没想出来,还百度了好久也没找到,博客里也没有相关的例子,幸好解决了,要不又要浪费好多时间,这里写出来分享一下。
好像写的也并不是很好,没有啥文采,看来需要多多练习啊,以后多写点博客。