【问题标题】:How to set background of listview?如何设置列表视图的背景?
【发布时间】:2011-08-20 09:34:14
【问题描述】:

我的一项活动中有一个ListView。我有一个扩展 ImageView 创建的自定义视图。我想将此自定义视图添加为列表视图的背景。因为我们有两个函数 setBackGroundDrawable(Drawable d)setBackGroundResource(resource)。我不能使用其中任何一个?

有人知道我该怎么做吗?我搜索了但找不到任何解决方案。

【问题讨论】:

  • 您需要什么?您正在尝试为列表或列表的每一行设置背景图像? List的背景属性使用有问题吗?
  • 我想为列表使用背景而不是每行?问题是如何设置自定义视图作为我上面所说的列表视图的背景。明白我的意思吗?如果可能的话,你能告诉我如何以编程方式为我的 customview 设置 id 吗?
  • 您正在设置图像(如 png 文件)或自定义可绘制对象?
  • custom drawables.means 我的自定义视图有一个 onDraw() 方法,我在其中绘制圆圈。

标签: android listview


【解决方案1】:

已编辑:当我得到一个教程时

当您想要动态绘制一些二维图形时,ShapeDrawable 对象可能会满足您的需要。使用ShapeDrawable,您可以以编程方式绘制原始形状并以任何可以想象的方式设置它们的样式。

ShapeDrawable 是Drawable 的扩展,因此您可以在任何需要Drawable 的地方使用一个ShapeDrawable — 可能用于视图的背景,使用setBackgroundDrawable() 设置。当然,您也可以将您的形状绘制为自己的自定义视图,以随意添加到您的布局中。因为 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。然后给它一个颜色并设置形状的边界。如果不设置边界,则不会绘制形状,如果不设置颜色,则默认为黑色。

定义了自定义视图后,可以按照您喜欢的任何方式进行绘制。通过上面的示例,我们可以在 Activity 中以编程方式绘制形状:

CustomDrawableView mCustomDrawableView;

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

    setContentView(mCustomDrawableView);
}

如果您想从 XML 布局而不是从 Activity 中绘制此自定义可绘制对象,则 CustomDrawable 类必须覆盖 View(Context, AttributeSet) 构造函数,该构造函数在通过 XML 膨胀实例化视图时调用。然后在 XML 中添加一个 CustomDrawable 元素,如下所示:

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

ShapeDrawable 类(与android.graphics.drawable 包中的许多其他Drawable 类型一样)允许您使用公共方法定义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>

并将您的自定义可绘制对象设置为 ImageView。

希望这会奏效。 :)

【讨论】:

  • 你误会了。我没有可绘制对象。我有自定义视图,它具有 onDraw() 方法,可以在画布上绘制圆圈。现在有什么想法吗?
【解决方案2】:

您不能将自定义View 用作ListView 的背景。 然而,解决方法可能是:

  • 使用RelativeLayout 作为父布局容器。
  • 为宽度和 高度
  • 将任何 id 作为list_background 提供给LinearLayout
  • 然后将ListView 添加到父RelativeLayout
  • 将属性android:layout_centerInParent="true" 添加到两个 ListViewLinearLayout
  • 删除ListViewCustomRow 的背景,如果你有 任何。
  • 现在在 Java 中获取 LinearLayout 并将 View 添加到其中 LinearLayout

【讨论】:

  • 在这种情况下,如果我会滚动,那么是否会滚动?因为使用某种方式(不是你在这里所说的)我能够同时显示两者,但是当我滚动时,只有列表视图滚动而不是我的自定义视图,因为它有画布要绘制。因为我的自定义视图扩展了 ImageView。所以可以设置它是 id,然后在 listview 上调用 setBackGroundResource(R.id.xyz)。有可能吗?
  • 您所描述的情况无法使用ListView
猜你喜欢
  • 2011-12-17
  • 2011-01-11
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
相关资源
最近更新 更多