3

今天我试图让我的列表视图更有活力。所以我创建了一个白色的 Ninepatch 图像并使用 .setColorFilter 方法添加了一个颜色过滤器。那不是问题。但是在应用这个之后,每次我滚动图像时(随机)缩放错误,所以可以说我的项目是 100dp 高,带有一些文本。滚动后,项目仍然是 100dp 高,所有文本都显示,但背景中的图像现在只使用 50dp。

这是我的代码:

这里我如何设置滤色器:

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

我希望有人能帮助我。因为这个错误让我很烦;(

4

2 回答 2

3

您的解释是正确的,您不能在多个视图上使用 Drawable。Drawable 的大小由其 View 设置,因此如果您同时将其附加到多个 View,除非 View 具有完全相同的尺寸,否则它将无法正常工作。

于 2011-05-04T15:46:33.240 回答
3

我能够自己解决我的问题。所以我为其他人回答这个问题;)。

问题是我在构造函数中加载了我的drawable一次,因为我认为我不必为每个新的listitem加载它。但是 android-system 将它们作为相同的内存对象处理。所以每个 listitem-background 都使用相同的内存空间(我希望它没有错,我想是这样)。如果我开始滚动下一个列表项将被声明并根据需要更改其背景的高度和宽度,例如下一项只有 50dp 高,它将保存的值更改为这个。现在列表的其他所有背景也将或多或少地改变到这个高度。

简单的解决方法是,您必须为每个新项目加载并应用颜色过滤器。特别说明。在 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);

我希望这个答案很有用。

编辑(简单千倍):

如果您只想将 colorFilter 应用于 Layout(Textview...),请这样做(感谢 Pasha):

TextView t = (TextView)v.findViewById(R.id.text);
t.getBackground().setColorFilter(0xff00c0ff, Mode.MULTIPLY );
于 2011-05-13T16:51:10.600 回答