2011-08-20 73 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'。 –