3

ViewHolderパターンを使用するリストビューを使用しており、キャッシュメカニズムを利用しています。これは、リストアイテムの背景の1つを設定しようとするコードスニペットです。

if(drawable!=null)
    {
        if(this.backgroundBurnColor!=null && this.backgroundBurnColor.getValue()!=0)
        {
            Log.d("burncolor", this.backgroundBurnColor.getValue()+"");
            drawable.setColorFilter(this.backgroundBurnColor.getValue(), Mode.MULTIPLY);


        }else if(this.burnColorKey!=null)
        {
            Log.d("burncolor", this.Owner.getOwner().getColors().get(this.burnColorKey).getValue()+"");
            drawable.setColorFilter(this.Owner.getOwner().getColors().get(this.burnColorKey).getValue(), Mode.MULTIPLY);
        }else{
            drawable.setColorFilter(null);
        }
        v.setBackgroundDrawable(drawable);
    }

このコードでは、ドローアブルは同じアイテムタイプ用ですが、ドローアブル画像を変更すると同じアイテムタイプであっても、必要に応じて変更されます。ただし、ドローアブルのカラーフィルターを変更すると、画面に表示されるリスト部分のすべてのドローアブルフィルターが変更されます。たとえば、リストを下にスクロールして別のカラーフィルターが画面に表示された場合、すべてのドローアブルのカラーフィルターが同じフィルターに変わります。各行に個別のカラーフィルターを取得する必要があります。何か助けはありますか?ありがとう

4

2 に答える 2

17

答えについて疑問に思う人のために、AndroidのドローアブルミューテーションについてのRomainGuyによるブログ投稿があります: http ://www.curious-creature.org/2009/05/02/drawable-mutations/

ドローアブルがリソースから参照される場合、ドローアブルの1つのインスタンスのみが初期化されるため、すべての参照が同じオブジェクトを参照します。この mutate()ためにドローアブルの方法があります

書く代わりに

 drawable.setColorFilter(null);

書き込み

 drawable.mutate().setColorFilter(null);

問題を解決します

于 2012-07-18T13:51:05.070 に答える
0

カラーフィルターはに設定されていDrawableます。したがって、2つのアイテムに同じカラーフィルターを設定したくない場合はDrawable、これら2つのアイテムに対して2つの別個のオブジェクトを用意する必要があります。

于 2012-07-11T16:46:17.343 に答える