2011-08-20 68 views
0

我的一項活動中有一個ListView。我有一個自定義視圖創建延伸ImageView。我想添加這個customview作爲listview的背景。因爲我們有兩個函數setBackGroundDrawable(Drawable d)setBackGroundResource(resource)。我不能使用這個中的任何一個?

任何人有任何好主意我怎麼能做到這一點?我搜索,但無法得到任何解決方案。如何設置listview的背景?

+0

您需要什麼?您正在嘗試爲List或List的每一行設置背景圖像?使用List的背景屬性有什麼問題嗎? –

+0

我想使用背景列表不是每行?問題是我如何設置自定義視圖,如上所述,作爲listview.Got我的觀點的背景?如果可能,你能告訴我如何以編程方式爲我的customview設置id? –

+0

你正在設置圖像(如PNG文件)或自定義繪圖? –

回答

1

編輯:我有一個教程

當你要動態地畫一些二維圖形,一個ShapeDrawable對象可能會滿足你的需求。通過ShapeDrawable,您可以通過編程方式繪製原始形狀並以任何可想象的方式對其進行設計。

ShapeDrawable是Drawable的擴展,所以你可以使用一個可以繪製Drawable的地方 - 也許是用於設置setBackgroundDrawable()的View的背景。當然,您也可以將自己的形狀繪製爲自己的自定義視圖,但是無論如何,您都可以將其添加到佈局中。由於ShapeDrawable具有自己的draw()方法,因此您可以創建View的子類,該子類在View.onDraw()方法中繪製ShapeDrawable。這裏,不只是這個View類的基礎擴展,繪製ShapeDrawable作爲景觀:

public class CustomDrawableView extends View { 
    private ShapeDrawable mDrawable; 

    public CustomDrawableView(Context context) { 
     super(context); 

     int x = 10; 
     int y = 10; 
     int width = 300; 
     int height = 50; 

     mDrawable = new ShapeDrawable(new OvalShape()); 
     mDrawable.getPaint().setColor(0xff74AC23); 
     mDrawable.setBounds(x, y, x + width, y + height); 
    } 

    protected void onDraw(Canvas canvas) { 
     mDrawable.draw(canvas); 
    } 
} 

在構造函數中,一個ShapeDrawable是定義爲一個OvalShape。然後給它一個顏色,並設置形狀的邊界。如果您未設置邊界,則不會繪製該形狀,而如果您未設置顏色,則會默認爲黑色。

使用自定義視圖定義,它可以任何你喜歡的方式繪製。與上面的例子中,我們可以在一個活動程序繪製形狀:

CustomDrawableView mCustomDrawableView; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mCustomDrawableView = new CustomDrawableView(this); 

    setContentView(mCustomDrawableView); 
} 

如果你想從XML佈局,而不是從活動得出這個自定義繪製,那麼CustomDrawable類必須覆蓋View(Context, AttributeSet)構造函數,在通過XML從通貨膨脹實例化View時調用。然後,CustomDrawable元素添加到XML,像這樣:

<com.example.shapedrawable.CustomDrawableView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    /> 

的ShapeDrawable類(像許多其他類型的可繪製在android.graphics.drawable包),您可以用公共的方法定義繪製的各種屬性。您可能需要調整的某些屬性包括Alpha透明度,顏色過濾器,抖動,不透明度和顏色。

您還可以使用XML定義原始可繪製形狀。有關更多信息,請參閱Drawable Resources document中關於Shape Drawables的部分。

試試:

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <com.example.shapedrawable.CustomDrawableView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 
    <ListView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:cacheColorHint="#00000000"/> 
</RelativeLayout> 

並設置自定義繪製,ABLES到ImageView的。

希望這會起作用。 :)

+0

你讓我錯了,我沒有drawable。我有自定義視圖,它有onDraw()方法,它是在畫布上繪製圓圈。現在有什麼想法? –

+0

@AndroidMirza我清楚這次了嗎? –

+0

這不是工作。謝謝!!!無論如何感謝您的幫助,+1。 –

0

您不能使用您的自定義View作爲背景ListView。 但是,一種解決方法可能是:

  • 使用RelativeLayout作爲父級佈局容器。
  • 添加LinearLayout有兩種寬度的fill_parent財產和 高度
  • 提供任何ID作爲list_backgroundLinearLayout
  • 然後將ListView添加到父RelativeLayout
  • 添加屬性android:layout_centerInParent="true"到兩個ListView和你CustomRowListViewLinearLayout
  • 去除背景的,如果您有任何 。
  • 現在得到的LinearLayout在Java中,並添加ViewLinearLayout
+0

在這種情況下,如果我將滾動然後將滾動或不滾動?因爲使用某種方式(不是我在這裏說的),我能夠顯示兩者,但是當滾動時,只有listview滾動不是我的自定義視圖,因爲它具有繪製的畫布。當我的自定義視圖擴展ImageView.So時,可以設置它是id,然後在listview上調用setBackGroundResource(R.id.xyz)。可能嗎? –

+0

你正在描述的情況是不可能的,使用'ListView'。 –