2013-02-03 46 views
1

我正在處理一個基於ListView的應用程序,我有一個非常奇怪的問題,我的ListItems重新包裝,正確的項目沒有顯示在正確的位置。爲了便於理解,我將每個ListItem上的文本設置爲與其位置相同。我在我的適配器getView()調用中執行此操作。如果我有Nexus 7 4 ListItems可見。如果我總共有10個ListItems,那麼它將變爲0,1,3,4,0,1,2,3,4。這適用於所有設備,假設最初在屏幕+1上的項目數量是正確的而所有其他ListItems被重新安裝。Android ListView項目收納

在我的代碼的哪一部分,你們認爲我的問題在於,因爲現在我一直在努力解決這個問題幾個小時,而且我很無能。非常感謝所有幫助。

編輯:

這裏是我的getView():

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    CountdownItem ci = mTitle.get(position); 

    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.list_item, parent, false); 

     holder = new CountdownViewHolder(); 
     holder.mTitle = (TextView) convertView.findViewById(R.id.textPrim); 
     holder.mSubtitle = (TextView) convertView 
       .findViewById(R.id.textSec); 
     holder.mDayProgress = (ProgressBar) convertView 
       .findViewById(R.id.day_progress); 
     holder.mMonthProgress = (ProgressBar) convertView 
       .findViewById(R.id.month_progress); 
     holder.mYearText = (TextView) convertView 
       .findViewById(R.id.year_text); 
     holder.day_help = (TextView) convertView 
       .findViewById(R.id.day_help); 
     holder.month_help = (TextView) convertView 
       .findViewById(R.id.month_help); 

     holder.setTitle(Integer.toString(position) + " Title"); 
     holder.setSubtitle(ci.getSubtitle()); 
     holder.fixImageAndText(position); 

     convertView.setTag(holder); 
    } else { 
     holder = (CountdownViewHolder) convertView.getTag(); 
    } 

    return convertView; 
} 
+1

發佈你的'getView()'方法的代碼。 ListAdapter可以回收視圖,也許你沒有正確考慮這一點。 –

+0

@DavidWasser我的getView()已被添加。 – SweSnow

回答

1

您沒有正確使用ViewHolder模式。下面的代碼需要if/else條款外return convertView之前移動:

holder.setTitle(Integer.toString(position) + " Title"); 
    holder.setSubtitle(ci.getSubtitle()); 
    holder.fixImageAndText(position); 
+0

非常感謝!我非常感謝!一直在這工作幾個小時,我不能相信我錯過了。你先生,是我的英雄。 – SweSnow

+0

謝謝!很高興能幫上忙。

1

是的,這是因爲Android的重用在列表視圖,來增加性能和渲染速度。

持有者模式用於存儲視圖id。檢索完畢後,您必須設置要在裏面看到的文字。

例如,您檢索數據(例如myDataArray[position]),如果一切正常,則繼續使用TextView的setText()設置標題,副標題,日曆進度等。

1

這是當它被重用細胞ListView的正確的行爲,問題是,你只在小區先設定值創建。

當convertView == null時,listview沒有可回收的單元。但是,一旦它創建了一些,它就可以在您滾動時重用它們來顯示。

即使convertView不爲null,您需要設置標題和副標題。這樣你就可以爲每個新的列表位置設置它們。