1

私の意見では、この質問は読む価値があると思います...詳細に説明しようとしましたが、読みやすいように抽象化しました。

  1. 私はListViewカスタムによって移入されていますCursorAdapter

  2. メソッドで、bindView()子の色を設定してみます。

  3. この子はLinearLayout、リスト内のアイテムに使用されるルート レイアウトです。カスタム CursorAdapterR.layout.list_itemのメソッドで拡張された XML ファイルにあります。newView()

  4. 以下のコードを使用して背景色を設定します。

    LinearLayout root = (LinearLayout) view.findViewById(R.id.list_item_root);
    // ...
    if (isEvenDay(cal)) {
        tvDate.setText(tvDate.getText() + " *");
        root.setBackgroundColor(Color.DKGRAY);
    }
    

setBackgroundColorif ブロック以外は気にしないでください。わかるでしょ。

予想される動作:一部の子はペイントDKGRAYされ、特定の textView に * 追加されます。その他はデフォルトの色になり、この * はありません。この * タグは、(直接) 私のコードではないことを確認するために使用します。

動作: ListView が最初に表示されたときは、期待どおりに問題ないように見えます。リストをスクロールすると、「奇妙」になり (わかりません)、すべての子がペイントされるまで、一部の子の色が変わり始めますDKGRAY

さて、最悪なのはこれが機能することです:

    LinearLayout root = (LinearLayout) view.findViewById(R.id.list_item_root);
    // ...
    if (isEvenDay(cal)) {
        tvDate.setText(tvDate.getText() + " *");
        root.setBackgroundColor(Color.DKGRAY);
    } else {
        root.setBackgroundColor(Color.GRAY);
    }

適切な子は DKGRAY と GRAY でペイントされ、リストをスクロールしてもリストの色がおかしくなることはありません。色は変わらず、すべて問題ないようです。もちろん、DKGRAY と GRAY は必要ありません。DKGRAY が必要で、他の子はそのままにしておきます。¬¬

私を助けてください!


以下の画像。最初の列の * が異なる日付間でどのように機能するかを確認してください。ただし、色は機能しません。

1-スクロールを開始すると、一部の子はすでに欠陥があります:

ここに画像の説明を入力

2-上下にスクロールを終了し、最終的にすべての子に欠陥があります:

ここに画像の説明を入力

3-しかし、すべての子に色を設定すると、スクロールしてもうまくいきません。

ここに画像の説明を入力

4

1 に答える 1

2

大量のメモリ内ビューを作成せず、大量の割り当てとガベージコレクションを引き起こさないようにするために、bindViewは、大きなリストをスクロールするときにすでに使用されている「リサイクル」ビューを提供します。このビューには、最後に使用されたときに発生した属性がすべて含まれます。このため、これらすべての属性を明示的に設定する必要があります。

したがって、灰色にしたい場合と白にしたい場合は、常にどちらかに設定する必要があります。信頼できる「デフォルト」はありません。

于 2011-11-20T20:12:06.033 に答える