【问题标题】:How to change a cardview color inside a listview programatically?如何以编程方式更改列表视图中的卡片视图颜色?
【发布时间】:2019-07-11 20:38:14
【问题描述】:

更新:我尝试创建 3 种不同的布局,一种是绿卡,另一种是红色,另一种是黄色。它仍然无法正常工作。所有颜色保持不变。 :(

我有一个 RFID 设备。当我阅读标签时,它会使用包含标签代码的卡片视图填充列表视图。

我只有 3 条规则:如果读取的标签存在于加载到设备中的文本文件中,则卡片将变为绿色。如果读取的标签在文本文件中不存在,则变为黄色。如果我没有读取文本文件中存在代码的标签(换句话说,如果标签丢失),卡片视图将变为红色。

一切正常。 RFID阅读器,应用程序,好的。 但我根本无法正确更改颜色。

有人知道怎么做吗?看起来很简单,但我真的想不通。

我做了一个 switch case,我尝试了 if/else,但没有任何效果。它只是将所有卡片的颜色更改为相同的颜色。 它不会单独更改颜色。 实际上,cardviews里面的信息是正确的!但我不明白为什么颜色不会单独改变。所有卡片都变成相同的颜色,无论它们是否被读取。

这是我的适配器类。请忽略注释行,它们都是我的尝试...

public class NewAdapter extends BaseAdapter {

    private Context context;
    private List<PropsCard> cardProps1;
    //private RecyclerView.Recycler<PropsCard> cardProps2;

    public NewAdapter(Context context, List<PropsCard> cardProps) {
        this.context = context;
        this.cardProps1 = cardProps;
    }

    @Override
    public int getCount() {
        return cardProps1.size();
    }

    @Override
    public Object getItem(int position) {
        return cardProps1.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        PropsCard cardProps = cardProps1.get(position);

        if (convertView == null) {

            for(com.example.compexrf.PropsCard card: cardProps1) {

                switch (card.cor) {
                    case 0:
                        //Red
                        //cd.setBackgroundColor(Color.parseColor("#F4BABA"));
                        //cdview_red.setCardBackgroundColor(Color.RED);
                        //bt.setBackgroundColor(Color.RED);
                        //CardView cdview_red = (CardView) convertView.findViewById(R.id.cdviewred);
                        //convertView.setBackgroundColor(Color.parseColor("#F4BABA"));
                        //convertView = View.inflate(context, R.layout.card_itens, null);
                        convertView = LayoutInflater.from(context).inflate(R.layout.card_itens, null);
                        //convertView.setBackgroundColor(Color.RED);

                        break;
                    case 1:
                        //Yellow
                        //cd.setBackgroundColor(Color.parseColor("#FCECA4"));
                        //cdview_yellow.setBackgroundColor(Color.YELLOW);
                        //CardView cdview_yellow = (CardView) convertView.findViewById(R.id.cdviewyellow);
                        //convertView.setBackgroundColor(Color.parseColor("#FCECA4"));
                        //convertView = View.inflate(context, R.layout.card_itens2, null);
                        convertView = LayoutInflater.from(context).inflate(R.layout.card_itens2, null);
                        //convertView.setBackgroundColor(Color.YELLOW);

                        break;
                    case 2:
                        //Green
                        //cd.setBackgroundColor(Color.parseColor("#5FDDC1"));
                        //cdview_green.setBackgroundColor(Color.GREEN);
                        //CardView cdview_green = (CardView) convertView.findViewById(R.id.cdviewgreen);
                        //convertView.setBackgroundColor(Color.parseColor("#5FDDC1"));
                        //convertView = View.inflate(context, R.layout.card_itens3, null);
                        convertView = LayoutInflater.from(context).inflate(R.layout.card_itens3, null);
                        //convertView.setBackgroundColor(Color.GREEN);

                        break;
                    default:
                        break;
                }

            }
        }

        TextView desc_txt = (TextView) convertView.findViewById(R.id.descricao);
        TextView cod_txt = (TextView) convertView.findViewById(R.id.codigoRFID);
        ImageView imageView = (ImageView) convertView.findViewById(R.id.image);
        //RelativeLayout relativeLayout = (RelativeLayout) convertView.findViewById(R.id.relative);
        CardView cd = (CardView) convertView.findViewById(R.id.cdviewred);
        CardView cd2 = (CardView) convertView.findViewById(R.id.cdviewyellow);
        CardView cd3 = (CardView) convertView.findViewById(R.id.cdviewgreen);

        //Button bt = (Button) convertView.findViewById(R.id.botao);

        desc_txt.setText(cardProps.desc);
        cod_txt.setText(cardProps.id);

        if (cardProps.desc.contains("Controlador")) {
            imageView.setImageResource(R.drawable.quadro);
            //relativeLayout.setBackgroundColor(Color.parseColor("F4BABA"));
        }

        else if (cardProps.desc.contains("Quadro")) {
            imageView.setImageResource(R.drawable.quadro);
            //relativeLayout.setBackgroundColor(Color.parseColor("FCECA4"));
        }

        else if (cardProps.desc.contains("Quadro")) {
            imageView.setImageResource(R.drawable.quadro);
        }

        else if (cardProps.desc.contains("Câmera de Validação Esteira")) {
            imageView.setImageResource(R.drawable.quadro);
        }

        else if (cardProps.desc.contains("Medicamentos")) {
            imageView.setImageResource(R.drawable.med);
            //relativeLayout.setBackgroundColor(Color.parseColor("5FDDC1"));
        }

        else if (cardProps.desc.contains("Impressora")) {
            imageView.setImageResource(R.drawable.printer01);
        }

        else {
            imageView.setImageResource(R.drawable.cpx);
        }

        return convertView;

    }

这是另一个帮助我满足需要的课程:

public class PropsCard implements Comparable<PropsCard> {

    String id;
    String desc;
    int cor;

    public PropsCard(String id, String desc, int cor){
        this.id = id;
        this.desc = desc;
        this.cor = cor;
    }

    public PropsCard(String id, int cor){
        this.id = id;
        this.desc = "";
        this.cor = cor;
    }

    @Override
    public boolean equals (Object object){
        if(object != null && object instanceof PropsCard){
            PropsCard obj = (PropsCard) object;
            return id.equals(obj.id);
        }
        return false;
    }

    @Override
    public int compareTo(PropsCard cdProp){
        if(cor > cdProp.cor)
            return 1;
        else if(cor == cdProp.cor)
            return 0;
        else
            return -1;
    }
}

这是我的 RFID 读取方法:

public void onScanCompleted(String code, String rssi, int type) {
            PropsCard rdCard = new PropsCard(code, 0);
            if(!cardList.contains(rdCard)){
                rdCard.cor = 1;
                cardList.add(rdCard);
            }
            else {
                int idx = cardList.indexOf(rdCard);
                rdCard = cardList.get(idx);
                if(rdCard.cor == 0) {
                    rdCard.cor = 2;
                    cardList.set(idx, rdCard);
                }
            }
            if(!ScanAndUhf.getHasData())
                makeCards(cardList);
        }
}

【问题讨论】:

    标签: java android android-cardview


    【解决方案1】:

    要更改 CardView 背景颜色,您应该使用 card.setCardBackgroundColor(color); 而不是 cd.setBackgroundColor(Color.parseColor("#FCECA4"));

    【讨论】:

    • 你好罗伯特。感谢您的回答。我也已经试过了。当它填充我的列表视图时,所有卡片都变成相同的颜色。看起来它采用了最后一个卡片视图的颜色并将其提供给所有其他人。我真的被困在这上面了。
    • 我还注意到,当您检查 switch(card.cor) 而不是像 cardProps.cor 这样的当前位置的卡片项目时,您会执行所有卡片的 for 循环?
    【解决方案2】:

    我建议您使用自定义适配器并使用可绘制对象。

    你可以在Example看到类似的东西

    虽然它在点击时会发生变化,但您只需要实现您的逻辑,但它会是这样的:

    public void onBindViewHolder(MyViewHolder holder, int position) {
    if(youritem==somevalue)
       holder.view.setBackgroundColor(Color.GREEN);
    else if(youritem==anothervalue)
       holder.view.setBackgroundColor(Color.parseColor("#somecolor"));
    }
    

    我一直使用这样的东西来改变文本颜色:

    @Override
    public void onBindViewHolder(OSCardAdapter.MyViewHolder holder, int position) {
    
        OSActivity OS = OSListFiltered.get(position);
    
    if(holder.status.getText().toString().equals("CLOSED"))
            {
                holder.status.setTextColor(Color.RED);
            }
    }
    

    您可以使用它来根据您的背景变化来改变文本颜色。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多