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
}
}
看起來很簡單吧,又學了一招!
就是因為我在這個監聽裡寫了一些對事件的處理:
裡面的LogUtils方法是我自定義的,是從別的地方學來的,這裡就不貼程式碼了。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"); } } }
我運行了程式,點到有ListView的頁面,問題就出來了,我我還沒開始選呢,這三個LogUtils就依次輸出來了,我瞬間就納悶了,為啥會出這個問題咧,想了一會,也請教了幾個人,都沒能給我答案,可能我當時表述的不是很清楚吧。
開始分析:
1、這是一個監聽事件,在條件滿足時才會觸發;
2、現在事件觸發了,是什麼地方滿足了它的觸發條件呢?
3、這個監聽事件是對RadiGroup的監聽,
holder.radioGroup.setOnCheckedChangeListener(newMyRadioChangeListener(holder));
從字面上理解就是當選擇改變的時候就會觸發這個監聽事件。
下面來看一張圖,是這個ListView的初步草圖:
從圖中就可以看出來一個問題,就是當繪製第二個item的時候,RadioGroup的選項改變了,他改變了,因此,這就是觸發條件,因為是複用的convertView,因此給RadioGroup的監聽事件一直存在,存在!當繪製第二個item的時候就會觸發第一次的事件,第三次觸發第二次的····然後,這就是問題了。
問了幾個人,好像他們並沒有遇到過這個問題,也許是我的描述不太清楚,並沒有好的建議給我,然後就一直思考,想了老半天,終於想到了一個方法,那就是每次給控制元件賦值,新增事件的時候把這個監聽給設為空,然後就有了這麼一句:
holder.radioGroup.setOnCheckedChangeListener(null);
就成這樣了
<span style="white-space:pre"> </span>holder.radioGroup.setOnCheckedChangeListener(null);
final HashMap<String,String> 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));
到此,問題就徹底的解決了。問題好像也不是很難,一開始想了半天沒想出來,還百度了好久也沒找到,部落格裡也沒有相關的例子,幸好解決了,要不又要浪費好多時間,這裡寫出來分享一下。
好像寫的也並不是很好,沒有啥文采,看來需要多多練習啊,以後多寫點部落格。