在 Android 的 Recycler View 中生成和设置文本视图背景的随机颜色

Posted

技术标签:

【中文标题】在 Android 的 Recycler View 中生成和设置文本视图背景的随机颜色【英文标题】:Generate and set random colors on text view background within Recycler View in Android 【发布时间】:2017-04-26 08:00:34 【问题描述】:

我正在尝试生成随机颜色并将随机颜色设置为文本视图的背景,就像在 GMail 应用程序中一样。文本视图具有最初在 xml 中设置的圆形背景,我使用形状完成了该背景。我做了一些研究并使用了一些互联网上可用的代码,但这些更改并未反映在我的应用程序中。

下面是我的 Recycler View Adapter 类:

    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.Items> 
        ArrayList<GmailDataHolder> data;
        Context context;

        public RecyclerViewAdapter(ArrayList<GmailDataHolder> data, Context context) 
            this.data = data;
            this.context = context;
        

        @Override
        public RecyclerViewAdapter.Items onCreateViewHolder(ViewGroup parent, int viewType) 
            View v = LayoutInflater.from(context).inflate(R.layout.gmail_layout_row, parent, false);
            Items i = new Items(v);
            return i;


        

        @Override
        public void onBindViewHolder(final RecyclerViewAdapter.Items holder, int position) 

//Generating Random Color
            int randomandroidColor = holder.androidColors[new Random().nextInt(holder.androidColors.length)];
            Drawable background = holder.circleTv.getBackground();
            if (background instanceof ShapeDrawable) 
                ((ShapeDrawable)background).getPaint().setColor(randomAndroidColor);
             else if (background instanceof GradientDrawable) 
                ((GradientDrawable)background).setColor(randomAndroidColor);
             else if (background instanceof ColorDrawable) 
                ((ColorDrawable)background).setColor(randomAndroidColor);
            
            holder.line1.setText(data.get(position).getLine1());
            holder.line2.setText(data.get(position).getLine2() + "...");
            holder.line3.setText(data.get(position).getLine3() + "...");
            holder.time.setText(data.get(position).getTime());


            //get Star Image State from mysql DB

            MyFunctions.getStarState(data, holder, position);
    holder.circleTv.setText(String.valueOf(data.get(position).getLine1().charAt(0)).toUpperCase());

            //Changing Star Image on Click
            MyFunctions.starClickListener(holder);


        

        @Override
        public int getItemCount() 
            return data.size();
        

        public class Items extends RecyclerView.ViewHolder 
            TextView circleTv, line1, line2, line3, time;
            int[] androidColors;
            public ImageView star;

            public Items(View itemView) 
                super(itemView);
//Loading Color from resources
                androidColors = itemView.getResources().getIntArray(R.array.androidcolors);
                circleTv = (TextView) itemView.findViewById(R.id.tv_circle);
                line1 = (TextView) itemView.findViewById(R.id.tv_line1);
                line2 = (TextView) itemView.findViewById(R.id.tv_line2);
                line3 = (TextView) itemView.findViewById(R.id.tv_line3);
                time = (TextView) itemView.findViewById(R.id.tv_time);
                star = (ImageView) itemView.findViewById(R.id.img_star);


            
        

Colors.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#dc4538</color>
    <color name="colorFacebook">#374dae</color>
    <color name="colorCenterFb">#d5617ae6</color>
    <color name="colorStartGoogle">#d8dd4c3a</color>
    <color name="colorEndGoogle">#dd4c3a</color>
    <color name="colorEndLinkedIn">#1887b0</color>
    <color name="colorStartLinkedIn">#e31887b0</color>
    <color name="colorStrokeLinkedIn">#ec106584</color>
    <color name="colorStrokeGoogle">#b73e2e</color>
    <color name="colorStrokeFacebook">#e2263a91</color>
    <color name="status">#ba3223</color>
    <item name="blue" type="color">#FF33B5E5</item>
    <item name="purple" type="color">#FFAA66CC</item>
    <item name="green" type="color">#FF99CC00</item>
    <item name="orange" type="color">#FFFFBB33</item>
    <item name="red" type="color">#FFFF4444</item>
    <item name="darkblue" type="color">#FF0099CC</item>
    <item name="darkpurple" type="color">#FF9933CC</item>
    <item name="darkgreen" type="color">#FF669900</item>
    <item name="darkorange" type="color">#FFFF8800</item>
    <item name="darkred" type="color">#FFCC0000</item>

    <integer-array name="androidcolors">
        <item>@color/blue</item>
        <item>@color/purple</item>
        <item>@color/green</item>
        <item>@color/orange</item>
        <item>@color/red</item>
        <item>@color/darkblue</item>
        <item>@color/darkpurple</item>
        <item>@color/darkgreen</item>
        <item>@color/darkorange</item>
        <item>@color/darkred</item>
    </integer-array>


</resources>

最初,TextView 在 xml 中声明了以下背景:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid
        android:color="#48b3ff"/>
</shape>

【问题讨论】:

【参考方案1】:
//  google's material design colours from    , 254 colors
//  http://www.google.com/design/spec/style/color.html#color-ui-color-palette

public String[] mColors = 
        "FFEBEE", "FFCDD2", "EF9A9A", "E57373", "EF5350", "F44336", "E53935",        //reds
        "D32F2F", "C62828", "B71C1C", "FF8A80", "FF5252", "FF1744", "D50000",
        "FCE4EC", "F8BBD0", "F48FB1", "F06292", "EC407A", "E91E63", "D81B60",        //pinks
        "C2185B", "AD1457", "880E4F", "FF80AB", "FF4081", "F50057", "C51162",
        "F3E5F5", "E1BEE7", "CE93D8", "BA68C8", "AB47BC", "9C27B0", "8E24AA",        //purples
        "7B1FA2", "6A1B9A", "4A148C", "EA80FC", "E040FB", "D500F9", "AA00FF",
        "EDE7F6", "D1C4E9", "B39DDB", "9575CD", "7E57C2", "673AB7", "5E35B1",        //deep purples
        "512DA8", "4527A0", "311B92", "B388FF", "7C4DFF", "651FFF", "6200EA",
        "E8EAF6", "C5CAE9", "9FA8DA", "7986CB", "5C6BC0", "3F51B5", "3949AB",        //indigo
        "303F9F", "283593", "1A237E", "8C9EFF", "536DFE", "3D5AFE", "304FFE",
        "E3F2FD", "BBDEFB", "90CAF9", "64B5F6", "42A5F5", "2196F3", "1E88E5",        //blue
        "1976D2", "1565C0", "0D47A1", "82B1FF", "448AFF", "2979FF", "2962FF",
        "E1F5FE", "B3E5FC", "81D4fA", "4fC3F7", "29B6FC", "03A9F4", "039BE5",        //light blue
        "0288D1", "0277BD", "01579B", "80D8FF", "40C4FF", "00B0FF", "0091EA",
        "E0F7FA", "B2EBF2", "80DEEA", "4DD0E1", "26C6DA", "00BCD4", "00ACC1",        //cyan
        "0097A7", "00838F", "006064", "84FFFF", "18FFFF", "00E5FF", "00B8D4",
        "E0F2F1", "B2DFDB", "80CBC4", "4DB6AC", "26A69A", "009688", "00897B",        //teal
        "00796B", "00695C", "004D40", "A7FFEB", "64FFDA", "1DE9B6", "00BFA5",
        "E8F5E9", "C8E6C9", "A5D6A7", "81C784", "66BB6A", "4CAF50", "43A047",        //green
        "388E3C", "2E7D32", "1B5E20", "B9F6CA", "69F0AE", "00E676", "00C853",
        "F1F8E9", "DCEDC8", "C5E1A5", "AED581", "9CCC65", "8BC34A", "7CB342",        //light green
        "689F38", "558B2F", "33691E", "CCFF90", "B2FF59", "76FF03", "64DD17",
        "F9FBE7", "F0F4C3", "E6EE9C", "DCE775", "D4E157", "CDDC39", "C0CA33",        //lime
        "A4B42B", "9E9D24", "827717", "F4FF81", "EEFF41", "C6FF00", "AEEA00",
        "FFFDE7", "FFF9C4", "FFF590", "FFF176", "FFEE58", "FFEB3B", "FDD835",        //yellow
        "FBC02D", "F9A825", "F57F17", "FFFF82", "FFFF00", "FFEA00", "FFD600",
        "FFF8E1", "FFECB3", "FFE082", "FFD54F", "FFCA28", "FFC107", "FFB300",        //amber
        "FFA000", "FF8F00", "FF6F00", "FFE57F", "FFD740", "FFC400", "FFAB00",
        "FFF3E0", "FFE0B2", "FFCC80", "FFB74D", "FFA726", "FF9800", "FB8C00",        //orange
        "F57C00", "EF6C00", "E65100", "FFD180", "FFAB40", "FF9100", "FF6D00",
        "FBE9A7", "FFCCBC", "FFAB91", "FF8A65", "FF7043", "FF5722", "F4511E",        //deep orange
        "E64A19", "D84315", "BF360C", "FF9E80", "FF6E40", "FF3D00", "DD2600",
        "EFEBE9", "D7CCC8", "BCAAA4", "A1887F", "8D6E63", "795548", "6D4C41",        //brown
        "5D4037", "4E342E", "3E2723",
        "FAFAFA", "F5F5F5", "EEEEEE", "E0E0E0", "BDBDBD", "9E9E9E", "757575",        //grey
        "616161", "424242", "212121",
        "ECEFF1", "CFD8DC", "B0BBC5", "90A4AE", "78909C", "607D8B", "546E7A",        //blue grey
        "455A64", "37474F", "263238"
;

这些是材料设计颜色。从中取一个随机颜色。

// generate a random number
int i = new Random().nextInt(254);

它会生成一个从 0 到 254 的随机数

GradientDrawable shape = new GradientDrawable();
        shape.setShape(GradientDrawable.OVAL);
        shape.setColor(Color.parseColor ("#"+mColors[new Random().nextInt(254)]));
        mTextView..setBackground(shape);

它将从列表中选择一种随机颜色并设置为 textview 背景颜色

【讨论】:

我已经生成了随机颜色,如上面的代码所示,但是当我在我的文本视图中设置它时问题就出现了。因为我需要颜色以圆形显示【参考方案2】:

如果您想生成随机(任何)颜色,您可以这样做Color.rgb(Math.random()*255, Math.random()*255, Math.random()*255)

如果你想从你的列表中选择颜色,我会建议离开那个 xml 文件并在 java 中列出你想要的所有颜色,然后只需使用从该数组中随机选择的颜色。

【讨论】:

我能够生成随机颜色,但是当我设置颜色时它没有反映在我的应用程序中【参考方案3】:
Random r = new Random();
    int red=r.nextInt(255 - 0 + 1)+0;
    int green=r.nextInt(255 - 0 + 1)+0;
    int blue=r.nextInt(255 - 0 + 1)+0;

    GradientDrawable draw = new GradientDrawable();
    draw.setShape(GradientDrawable.OVAL);
    draw.setColor(Color.rgb(red,green,blue));
    mTextView.setBackground(draw);

【讨论】:

这将在用户每次滚动时设置一个随机颜色。 最后加0的逻辑是什么?你能解释一下吗?【参考方案4】:

如果您需要使用自己/所需的颜色,只需使用以下代码

List<String> colors;

colors=new ArrayList<String>();

        colors.add("#5E97F6");
        colors.add("#9CCC65");
        colors.add("#FF8A65");
        colors.add("#9E9E9E");
        colors.add("#9FA8DA");
        colors.add("#90A4AE");
        colors.add("#AED581");
        colors.add("#F6BF26");
        colors.add("#FFA726");
        colors.add("#4DD0E1");
        colors.add("#BA68C8");
        colors.add("#A1887F");

// all colors used by gmail application :) may be,

 // genrating random num from 0 to 11 because you can add more or less 

Random r = new Random();
        int i1 = r.nextInt(11- 0) + 0;

//genrating shape with colors 

GradientDrawable draw = new GradientDrawable();
        draw.setShape(GradientDrawable.OVAL);
        draw.setColor(Color.parseColor(colors.get(i1)))

// assigning to textview 
contact_name_circle.setBackground(draw); //textview

【讨论】:

【参考方案5】:

在您的onBindViewHolder 中,您可以执行以下操作:

int remainder = getAdapterPosition() % colorsArray.size();  
mView.setCardBackgroundColor(Color.parseColor(colorsArray.get(remainder)));

这样,每个 RecyclerView 项目将在滚动时显示相同的颜色,并且每次用户看到此列表时也会显示相同的颜色。

【讨论】:

【参考方案6】:

这就是你想要的

关于 BindViewHolder 方法

 Random r = new Random();
    int red=r.nextInt(255 - 0 + 1)+0;
    int green=r.nextInt(255 - 0 + 1)+0;
    int blue=r.nextInt(255 - 0 + 1)+0;

    GradientDrawable draw = new GradientDrawable();
    draw.setShape(GradientDrawable.RECTANGLE);
    draw.setColor(Color.rgb(red,green,blue));
    holder.viewInside.setBackground(draw);

ps-view里面是视图的名字。

如果您想要确切类型的 Gmail 视图,那么您可以使用这个小型库,它将为您提供您想要的确切内容。

https://github.com/amulyakhare/TextDrawable

【讨论】:

你能解释一下如何制作第二种视图吗? @BlackBlind 请解释一下。它只是一个回收者视图。

以上是关于在 Android 的 Recycler View 中生成和设置文本视图背景的随机颜色的主要内容,如果未能解决你的问题,请参考以下文章

谁能建议如何在android Recycler View中按产品价格实现排序[关闭]

Recycler View Android中的Firestore数据[重复]

在 Android 的 Recycler View 中生成和设置文本视图背景的随机颜色

我的应用程序的Recycler View问题中的Android Studio SearchView过滤器

在 Recycler View 中,从 LinearLayoutManger 转换为 GridLayoutManager 没有区别

Recycler View重复,如何查看一次