3

今日、リストビューをもう少し動的にしようとしました。だから私は白いninepatch-imageを作成し、.setColorFilterメソッドでカラーフィルターを追加しました. それは問題ではありません。しかし、これを適用した後、スクロールするたびに画像のスケーリングが(ランダムに)間違っているため、アイテムの高さが100dpでテキストがあるとしましょう。スクロール後、アイテムの高さは 100 dp のままで、すべてのテキストが表示されますが、背景の画像は現在 50 dp しか使用していません。

これが私のコードです:

ここで、カラーフィルターの設定方法:

orgleftbox = context.getResources().getDrawable(R.drawable.list_bubble);
orgleftbox.setColorFilter( 0xff00c0ff, Mode.MULTIPLY );

ここで、アダプターに追加する方法

v = inflater.inflate(R.layout.list_view_item, null);            
TextView t = (TextView)v.findViewById(R.id.text);
t.setBackgroundDrawable(orgrightbox);

誰かが私を助けてくれることを願っています。このバグは私を悩ませているので;(

4

2 に答える 2

3

私は自分で問題を解決することができました。だから私は他のみんなのためにこれに答えます;)。

問題は、コンストラクターにドローアブルを一度ロードしたことです。これは、新しいリストアイテムごとにドローアブルをロードする必要がないと思ったためです。しかし、android-systemはそれらを同じメモリオブジェクトとして処理します。したがって、すべてのlistitem-backgroundは同じmem-spaceを使用します(間違っていないことを願っています、そう思います)。スクロールを開始すると、次のリストアイテムが宣言され、背景の高さと幅が必要に応じて変更されます。たとえば、次のアイテムの高さはわずか50 dpで、保存された値がこの値に変更されます。これで、リストの他のすべての背景も多かれ少なかれこの高さに変わります。

簡単な修正は、新しいアイテムごとにカラーフィルターをロードして適用する必要があるということです。espec。getViewメソッドで。

@Override
public View getView(int pos, View convertView, ViewGroup parent) {
    View v = null;
    leftbox = (NinePatchDrawable) r.getDrawable(R.drawable.bubble_green);
    leftbox.setColorFilter( 0xff00c0ff, Mode.MULTIPLY );

    v = inflater.inflate(R.layout.list_view_item_right, null);
    TextView t = (TextView)v.findViewById(R.id.text);
    t.setBackgroundDrawable(leftbox);

この回答がお役に立てば幸いです。

編集(数千倍簡単):

colorFilterをLayout(Textview ...)にのみ適用する場合は、次のようにします(Pashaに感謝)。

TextView t = (TextView)v.findViewById(R.id.text);
t.getBackground().setColorFilter(0xff00c0ff, Mode.MULTIPLY );
于 2011-05-13T16:51:10.600 に答える
3

あなたの解釈は正しいです。複数のビューで Drawable を使用することはできません。Drawable は View ごとにサイズが設定されているため、複数の View に同時にアタッチすると、View のサイズがまったく同じでないと正しく動作しません。

于 2011-05-04T15:46:33.240 に答える