這個問題糾結了許久,最終上某論壇看到了答案,解決了,感覺好神奇!
本來我要顯示的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,問題解決!