在ArrayAdapter中设置drawable的颜色会影响所有项目

时间:2017-10-17 19:30:40

标签: android listview android-drawable

设置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));
            }
        }
    }
}

我还尝试从资源

再次加载drawable
Drawable d = getContext().getResources().getDrawable(R.drawable.item_icon);
d.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN))
logo.setBackground(d);

但没有任何影响。

有人能看出我的错误吗?

0 个答案:

没有答案