2011-05-04 26 views
3

今天我試圖讓我的listview更有活力。所以我創建了一個白色ninepatch-image,並添加了一個使用.setColorFilter方法的colorfilter。這不是問題。 但應用後,每當我滾動圖像縮放錯誤(隨機),所以讓我說我的項目是100dp高與一些文字。滾動後,項目仍爲100dp高,並顯示所有文本,但背景中的圖像現在僅使用50dp。應用Colorfilter後滾動Ninepatch縮放錯誤?

這裏是我的代碼:

在這裏,我如何設置Colorfilter:

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); 

添加它,我希望有人能夠幫助我。因爲這個bug讓我煩惱;(

+0

什麼類,你用於orgleftbox? NinePatchDrawable還是簡單的Drawable? – Pasha 2011-05-04 13:55:34

+0

我使用普通的Drawable可以導致這個問題嗎? – mikepenz 2011-05-04 13:57:54

+0

我不確定,但如果您將Drawable更改爲NinePatchDrawable其幫助。 – Pasha 2011-05-04 14:00:47

回答

3

我能夠解決我自己的問題,所以我回答這個給其他人;)。

問題是我在構造函數中加載了一次drawable,因爲我認爲我不必爲每個listitem加載它。但是android系統把它們當作同一個內存對象來處理。所以每個listitem-background使用相同的mem空間(我希望它沒有錯,我認爲是這樣)。如果我開始滾動,下一個listitem將被聲明並根據需要更改其背景的高度和寬度,例如,下一個項目只有50dp高,它將保存的值更改爲這個值。現在,列表中的其他所有背景也會或多或少地變化到這個高度。

簡單的修復方法是,您必須爲每個新項目加載並應用colorfilter。愛斯佩克。在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); 

我希望這個答案很有用。

EDIT(千字簡單的時代):

如果你只想一個colorFilter適用於佈局(TextView中...)做這種方式(感謝帕夏):

TextView t = (TextView)v.findViewById(R.id.text); 
t.getBackground().setColorFilter(0xff00c0ff, Mode.MULTIPLY); 
3

你的解釋是正確的,你不能在多個視圖上使用Drawable Drawable的大小是由它的View設置的,所以如果你同時將它附加到幾個視圖上,將無法正常工作,除非視圖具有完全相同的尺寸。

+0

是的,我在上面寫我的解決方案。如果我將它設置爲全部,它將無法工作,所以我必須爲每個設置它(不是相同的drawable,因此不是與MEM相同的鏈接),我希望我不會在上面描述它太錯誤?我的主要語言是德語,所以我希望我能夠儘可能清楚地描述它 – mikepenz 2011-05-04 16:32:21