设置drawable的颜色会更改列表中所有项目的颜色。 在textviews中设置文本按预期工作,但Drawable的颜色会覆盖所有现有项目。 (getDrawable()返回的drawable是每个项目的新实例,通过debuging检查)。 如果我使用不同的Drawables,它也可以工作。
我在问题所在的代码中添加了一些注释。
public class MyAdapter extends ArrayAdapter<Item> {
public MyAdapter(Activity activity, List<Item> data) {
super(activity, R.layout.list_item_Item, data);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final View result;
if (convertView == null) {
result = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_Item, parent, false);
} else {
result = convertView;
}
final Item item = getItem(position);
if (item == null) {
return result;
}
((TextView) result.findViewById(R.id.item_name)).setText(item.getTitle());
((TextView) result.findViewById(R.id.item_description)).setText(item.getDescription());
// final modifier is just for testing inside onClickListener also without it is not working
final ImageView logo = ((ImageView) result.findViewById(R.id.item_icon));
logo.setImageResource(R.drawable.fancy_icon);
// logo.getDrawable() is giving a new Instance for each list entry
// this line overwrites all drawable colors in the complete list
logo.getDrawable().setColorFilter(new PorterDuffColorFilter(item.isChecked()?Color.GREEN:Color.GREY, PorterDuff.Mode.SRC_IN));
result.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// this works as expected, and change only the curent one
logo.getDrawable().setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SRC_IN));
}
}
}
}
我还尝试从资源
再次加载drawableDrawable d = getContext().getResources().getDrawable(R.drawable.item_icon);
d.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN))
logo.setBackground(d);
但没有任何影响。
有人能看出我的错误吗?