2016-08-22 7 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のサイズが同じになるため、最初の2行をループの外側に配置します。これは私が試した方法です:

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

アイテムの高さがすべて同じ場合、ループは必要ありません。最終的な高さは 'adapterCount'と' height'です – Blackbelt

+0

あなたの答えをありがとう。私の考えは、高さを一度計算してからadapterCountでそれを掛けることです。しかし、私はそれを神秘的に行っています。 –

答えて

1

あなたがやっていることは、リストビューの考え方に完全に反することです。そのようなgetViewを呼び出すと、リスト内のすべての行について行ビューを作成するよう強制されます。これは、listViewが避けようとしているものです。さらに悪いことに、あなたはそれらを保存していません。だからあなたは無意味でそれらを作成しています。これは決してうまく行かないでしょうし、あなたはあなたが必要と思っている場合、あなたはあなたのアプリを間違ってデザインしています。

+0

2つの潜在的に大きいListView(データが異なるテーブルからフェッチされる)を互いに重ねて設定し、大きなリストビューのようにシームレスにスクロールする方法はありますか? –

+1

2つのリストビューを使用しないでください。 1つのリストビューにします。リストビューのすべての行が同じタイプのビューを持っている必要はないことを覚えておいてください。それらをすべて1つのアダプターに結合することも、アダプターのアダプターのアプローチを使用することもできます。 –

+0

ありがとう、私はアプローチを考え直すよ –

関連する問題