かなり新しいAndroidデベロッパーはここにあります。スクロール時にgetViewが間違った位置で呼び出されました
私は奇妙な問題に遭遇しました。私は回避策がわかりません。私はここで、私が抱えているのと同じ問題だと思うが、彼らの問題に対する解決策は、ここで起こっていることには当てはまりそうにないような、多くの問題を読んだ。
BaseListを拡張し、ビューホルダーを使用する別のクラスを使用してカスタムlistViewをセットアップしました。これはカスタムリストビューのいろいろな例を見ています。テキストビュー、ボタン、プログレスバー、イメージボタンがあり、これらの項目はファイルのダウンロードに使用されるAsyncTaskに基づいて非表示/変更されます。
リストをゆっくりとスクロールすると、すべてうまく動作します。リストをすばやく上下にスクロールすると、リスト内の一部のセルのビューが他のセルに再割り当てされたようになります。
は、私は私のアダプタクラスで私の「getViewメソッド」メソッドの先頭に次の行を置く:
@Override
public View getView(final int pos, View convertView, ViewGroup parent)
{
Log.i("ks3","getView called, position is " + pos);
私は画面に収まら7つの私のリスト内の項目、およびそれらの6を持っています。それが最初に表示されます場合は、私は私のログでこれを参照してください。
getView called, position is 0
getView called, position is 1
getView called, position is 2
getView called, position is 3
getView called, position is 4
getView called, position is 5
私は次の項目にゆっくりスクロールダウンすると、これは次のプリントアウトされます。
getView called, position is 6
私は戻ってスクロールし、これを:
getView called, position is 0
これらの結果を完全に生成します。
私はすぐに前後にスクロールを開始すると、それは主に位置として6と0を示し、このメッセージを何回の束を出力し、時折、私は同様にこれらが表示されます。
getView called, position is 1
getView called, position is 5
体位を1彼らは常に画面上にあるので、5は呼び出されるべきではありません。これは、getViewがすべて混乱したようです。同時に、私が前に述べたように、私のリストは奇妙に見えます。イメージボタンは、セルの上または下に移動しないでください。
私がスムーズにスクロールすることに戻った場合、私は位置のために0と6だけをもう一度見ます。
正直なところ、これを回避する方法がわかりません。私はあなたがリストをスクロールすることができる速度を制限することができたかもしれないが、何かを見つけることができなかったかもしれないと思った。
ありがとうございます!
編集: この質問についていくつか更新したいと思います。最初のことは、ここのコメントやlistViewのGoogleビデオから、getViewは測定などのために想像した他のもののために呼び出すことができるということに気づいたので、私は気にするべきではありません私が元々考えていたことは私の問題の一部であった(私はgetViewが間違った位置で呼ばれていると思っていた)。
第2に、「アダプターの内部にビューをキャッシュする」ことは非常に悪い考えです。私はこれが何を意味するのかがはっきりしていませんが、私が間違っていることの一つであると確信しています(ボタンのインスタンスを保存します、progressBar、imageButton ...)。
これは、getView以外のビューを更新するという事実とともに、私はnotifyDataSetChanged()を使用しません。一緒にそれらはおそらくいくつかの厄介なものが起こる原因になります。
あなたのカスタムListViewが何かファンキーなことをしていない限り、これはリサイクルの問題のように聞こえ、完全なgetView()コードを投稿します。 – dmon
コードでエラーが見つからず、Honeycomb以上を使用している場合は、リストレイアウトのハードウェアアクセラレーションを無効にすることができます。ハードウェアアクセラレーションは、このようなエラーを引き起こす可能 – zapl
リサイクル問題のように感じます。 listViewのGoogleビデオを見て、listViewをどのように使用しているかに目立った問題がないかどうかを確認します。 – Droidmon