ListView的連續getView兩輪的解決方法

這個問題糾結了許久,最終上某論壇看到了答案,解決了,感覺好神奇!

本來我要顯示的listView爲:



然而,它顯示的是:


第一個item和最後一個item是一樣的。

首先送上我的代碼片段,這是BaseAdapter的getView方法重寫:

			public View getView(int position, View contentView, ViewGroup parent) {
				ViewHolder holder=null;
				if(contentView==null){
					contentView=LayoutInflater
							.from(getActivity())
							.inflate(R.layout.layout_job_info, null);
					holder=new ViewHolder();
					holder.txtJName=(TextView) contentView.findViewById(R.id.txtJobName);
					holder.txtJTime=(TextView) contentView.findViewById(R.id.txtJobTimeNeeded);
					holder.txtJPiority=(TextView) contentView.findViewById(R.id.txtJobPiority);
					contentView.setTag(holder);
				}else{
					holder=(ViewHolder) contentView.getTag();
				}
				if(position==0){    //第一行默認顯示
					return contentView;
				}else{
					holder.txtJName.setText(jobs[position-1].getName()+"");
					holder.txtJPiority.setText(jobs[position-1].getPriority()+"");
					holder.txtJTime.setText(jobs[position-1].getTimeNeeded()+"");
					return contentView;
				}
				
			}

按照單步調試,當position==0時,返回的是默認值,這個沒錯。可是在往後面單步運行,神奇的一幕發生了!它在position==4之後,又進行了第二輪的getView,而此輪position==0時的contentView已經不再是null了,而是最後一個item(因爲setTag了)。所以在第二輪getView的時候,第一個item改成了第五個item。

那麼問題來了,爲什麼它會進行第二輪的getView呢?

原因就是:我在XML的ListView定義高度爲wrap_content,所以Adapter並不知道ListView的高度,它因而也不知道該getView幾次來滿足ListView,因此會通過兩輪的getView來確認。

所以,解決方法就是:給ListView設置確定的高度,或者是match_parent,或者是把ListView放在一個LinearLayout中,然後設置高度爲match_parent,問題解決!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章