1. 程式人生 > >Android的ListView中給RadioGroup新增setOnCheckChangeListener的問題之一

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的初步草圖:

從圖中就可以看出來一個問題,就是當繪製第二個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));
到此,問題就徹底的解決了。問題好像也不是很難,一開始想了半天沒想出來,還百度了好久也沒找到,部落格裡也沒有相關的例子,幸好解決了,要不又要浪費好多時間,這裡寫出來分享一下。

好像寫的也並不是很好,沒有啥文采,看來需要多多練習啊,以後多寫點部落格。