1

我正在尝试调试我遇到的 ExpandableListAdapter.getChildView 问题。

我已经为列表项的背景定义了一个包含渐变的形状和一个半径为 1 的角的 Drawable - 没有什么特别的。

然后,在我的适配器代码中,我在 getChildView 中有这个片段:

GradientDrawable background = (GradientDrawable) convertView.getBackground();
float topRadius = 0;
float bottomRadius = 0;

// Make the corner radius obvious for debugging             
if (childPosition == 0)
    topRadius = 14;
if (childPosition == (mValues.size() - 1))
    bottomRadius = 14;

background.setCornerRadii(new float [] { topRadius, topRadius, 
                                         topRadius, topRadius,  
                                         bottomRadius, bottomRadius, 
                                         bottomRadius, bottomRadius});
convertView.setBackgroundDrawable(background);

这里的尝试是舍入第一个列表项的顶部和最后一个列表项的底部。通过调试,我似乎正在为我想要的项目设置我想要的值。

但是,我遇到的问题是正在为所有列表项设置角半径,就好像它是底部项一样。

顺便说一句,有没有办法获得 GradientDrawable 的角半径,至少用于调试目的?

谢谢,
wTS

4

2 回答 2

16

与其调用 setCornerRadii(),不如调用 mutate().setCornerRadii(),这应该可以解决您的问题(完整说明可在http://www.curious-creature.org/2009/05/02/drawable-mutations/获得)

编辑(Wonko)
这几乎是正确的(并且提供的链接基本上解释了原因)。唯一的变化是 mutate() 返回一个 Drawable,它没有 setCornerRadii() 方法。相反,您需要将变异的对象转换回 GradientDrawable,它就像一个魅力。

((GradientDrawable) background.mutate()).setCornerRadii(
    new float [] { topRadius, topRadius, topRadius, topRadius,  
                   bottomRadius, bottomRadius, bottomRadius, bottomRadius});
于 2010-12-03T17:32:53.443 回答
2

编辑:刚刚意识到这不是解决 OP 问题的方法。

除了 Mathias 的评论之外,解决此问题的方法是首先将半径设置为 1,然后设置各个角半径:

background.setCornerRadius(1.0f);
background.setCornerRadii(new float [] { topRadius, topRadius,  
                                         topRadius, topRadius,   
                                         bottomRadius, bottomRadius,  
                                         bottomRadius, bottomRadius}); 

让我知道这是否能解决问题。至于获得拐角半径,我不知道有什么办法......

于 2010-12-03T17:21:19.867 回答