2016-08-22 59 views
0

我正面臨着我一直無法解決的最奇怪的問題。adapter.getview中的IllegalStateException異常循環

我有以下環路它做正確的工作:

for (int i = 0; i < adapterCount; i++) { 
    View listItem = mListAdapter.getView(i, null, mListView); 
    listItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED); 
    height += listItem.getMeasuredHeight(); 
} 

但是它是緩慢的。爲了提高性能,並且因爲每個listItem將具有相同的大小,我想將前兩行放在循環外部。這是我嘗試:

View listItem = mListAdapter.getView(0, null, mListView); 
listItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED); 
for (int i = 0; i < adapterCount; i++) { 
    height += listItem.getMeasuredHeight(); 
} 

但是這給了我一個例外,在第一行:

java.lang.IllegalStateException: couldn't move cursor to position 0 

沒有人有任何想法這是爲什麼?

謝謝!

+0

adapterCount == 0.好吧。 – greenapps

+2

如果項目具有完全相同的高度,則不需要循環。最後的高度是'adaptorCount'次'高度' – Blackbelt

+0

謝謝你的回答。我的想法是計算高度一次,然後乘以adapterCount,但我神祕地這樣做的方式給了我一個例外 –

回答

1

你在做什麼完全違背了listview的整個想法。像這樣調用getView將迫使它爲列表中的每一行創建一個行視圖。這就是listView要避免的原因。更糟糕的是,你甚至沒有保存它們。所以你創造它們是沒有目的的。這絕不會表現出色,而且你根本不應該這樣做 - 如果你認爲你需要這樣做,那麼你正在設計你的應用程序是錯誤的。

+0

是否有任何其他方式將兩個潛在的大型ListView(其數據是從不同的表中獲取的)彼此重疊,並像一個大的listview一樣無縫滾動它們? –

+1

不要使用兩個列表視圖?讓它成爲一個listview。請記住,如果這是您的擔心,那麼不是listview中的每一行都必須具有相同類型的視圖。您可以將它們全部組合到一個適配器中,也可以使用適配器的適配器方法。 –

+0

謝謝,我會重新考慮我的方法 –