【问题标题】:How to create ListView items with random color on KitKat如何在 KitKat 上创建具有随机颜色的 ListView 项目
【发布时间】:2017-09-25 09:59:17
【问题描述】:

我正在尝试在 KitKat 上使用随机生成的颜色创建 ListView。
问题:它只为不同的项目显示相同的颜色。
这是我的代码:

Drawable d = getResources().getDrawable(R.drawable.main_item_image_background);
        int r = (int) (Math.random() * 256);
        int g = (int) (Math.random() * 256);
        int b = (int) (Math.random() * 256);

        int randColor = Color.argb(255, r, g, b);

        d.setColorFilter(new PorterDuffColorFilter(randColor, PorterDuff.Mode.SRC_IN));
        viewHolder.ivLogoBackground.setImageDrawable(d);  

我也尝试过这样做:

Random rand = new Random();
int r = rand.nextInt(256);
int g = rand.nextInt(256);
int b = rand.nextInt(256);

它在 Lollipop 或更高版本上运行良好,但在 KitKat 上它为每个项目显示相同的颜色。 我认为问题出在d.setColorFilter(new PorterDuffColorFilter(randColor, PorterDuff.Mode.SRC_IN));

安卓手机:

Android KitKat:

解决方案: Drawable 必须有 mutate() 方法。然后列表项中的图像将是不同的颜色:)

【问题讨论】:

  • This answer 应该会有所帮助。
  • @Ajil O 不幸的是没有。我的屏幕截图显示setColorFilter 方法正在运行。但颜色不是随机生成的。
  • 你的drawable是什么样子的?
  • @Ajil O 这是 xml 格式的 svg。我发现了问题。最初我的drawable是不可变的,所以我添加了d.mutate(),现在它就像一个魅力:)

标签: android listview svg colors android-4.4-kitkat


【解决方案1】:

///适配器类

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.CustomViewHolder> {
private ColorGenerator generator;
private Activity mActivity;
private ArrayList<String> iDataList;
public TestAdapter(Activity activity, ArrayList<String> countryList, int limit, boolean isLiveCountry) {
    this.mActivity = activity;
    generator = ColorGenerator.MATERIAL;
}

@Override
public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_item, parent, false);
    return new CustomViewHolder(view);
}

@Override
public void onBindViewHolder(CustomViewHolder holder, final int position) {

    int color = generator.getRandomColor();
    holder.view.setBackgroundColor(color);
}

@Override
public int getItemCount() {
    return iDataList.size();

}
public class CustomViewHolder extends RecyclerView.ViewHolder {
    private View view;

    public CustomViewHolder(View itemView) {
        super(itemView);
        view =  itemView.findViewById(R.id.view);
    }
}

}

//颜色生成器

public class ColorGenerator {
public static ColorGenerator DEFAULT;

public static ColorGenerator MATERIAL;

static {
    DEFAULT = create(Arrays.asList(
            0xfff16364,
            0xfff58559,
            0xfff9a43e,
            0xffe4c62e,
            0xff67bf74,
            0xff59a2be,
            0xff2093cd,
            0xffad62a7,
            0xff805781
    ));
    MATERIAL = create(Arrays.asList(
            0xffe57373,
            0xfff06292,
            0xffba68c8,
            0xff9575cd,
            0xff7986cb,
            0xff64b5f6,
            0xff4fc3f7,
            0xff4dd0e1,
            0xff4db6ac,
            0xff81c784,
            0xffaed581,
            0xffff8a65,
            0xffd4e157,
            0xffffd54f,
            0xffffb74d,
            0xffa1887f,
            0xff90a4ae
    ));
}

private final List<Integer> mColors;
private final Random mRandom;

public static ColorGenerator create(List<Integer> colorList) {
    return new ColorGenerator(colorList);
}

private ColorGenerator(List<Integer> colorList) {
    mColors = colorList;
    mRandom = new Random(System.currentTimeMillis());
}

public int getRandomColor() {
    return mColors.get(mRandom.nextInt(mColors.size()));
}

public int getColor(Object key) {
    return mColors.get(Math.abs(key.hashCode()) % mColors.size());
}

【讨论】:

  • 谢谢,但我认为这不是我想要的。
  • 这将为 listview 或 recyleView 的每个项目生成随机颜色。这就是你要求的,对吧?
  • 这将从颜色列表中生成随机颜色。但我需要从各种颜色中随机获取。再一次,这个答案在 KitKat 上无法正常工作。
猜你喜欢
  • 1970-01-01
  • 2011-03-24
  • 2017-02-20
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2015-12-06
相关资源
最近更新 更多