简体   繁体   中英

How to change the indicator color every different cardview?

I create a cardview design with indicator in the left (Red, Green) but i have problem, how can i change the indicator color depends on the status from database. If the status say "No" then the indicator turn red and if "Yes" the indicator turn green.

在此处输入图片说明

This is the xml file :

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        card_view:cardCornerRadius="6dp"
        card_view:cardElevation="3dp"
        card_view:cardUseCompatPadding="true">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="0.9">

                <ImageView
                    android:layout_marginLeft="22dp"
                    android:layout_marginTop="14dp"
                    android:layout_marginBottom="14dp"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="@drawable/rectangle"/>

            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="0.1"
                android:orientation="vertical">

                <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    android:id="@+id/layout_card_item"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="5dp"
                    android:orientation="vertical"
                    android:padding="5dp">


                    <TextView
                        android:id="@+id/txt_order_date"
                        android:textSize="13sp"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"/>

                    <TextView
                        android:id="@+id/txt_customer_name"

                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"/>
                    <TextView
                        android:id="@+id/txt_order_number"
                        android:textSize="12sp"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"/>

                    <TextView
                        android:id="@+id/txt_product_status"
                        android:textSize="12sp"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"/>
                    <TextView
                        android:id="@+id/txt_notes"
                        android:textSize="12sp"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:singleLine="false"
                        android:layout_weight="1"
                        android:maxLines="4"/>

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="30dp"
                        android:background="@drawable/layout_bg"
                        android:descendantFocusability="blocksDescendants"
                        android:orientation="horizontal"
                        android:layout_below="@+id/layout_card_item"
                        android:gravity="center"
                        android:weightSum="1">

                        <Button
                            android:id="@+id/download_pdf"
                            android:textSize="14sp"
                            android:layout_width="wrap_content"
                            android:layout_height="30dp"
                            android:background="#e1e3e8"
                            android:focusable="false"
                            android:textColor="#000307"
                            android:focusableInTouchMode="true"
                            android:drawableLeft="@drawable/ic_pictogram_download_orange"
                            android:text="  Download PDF"
                             />
                        <!--<ImageButton-->
                            <!--android:layout_width="10dp"-->
                            <!--android:layout_height="10dp"-->
                            <!--android:src="@mipmap/ic_order_download_pdf"/>-->


                    </LinearLayout>


                </LinearLayout>



            </LinearLayout>
        </LinearLayout>



    </android.support.v7.widget.CardView>
</LinearLayout>

This is the adapter :

public class OrderListAdapter extends RecyclerView.Adapter<OrderListAdapter.OrderListViewHolder> {

    private ArrayList<OrderListModel> itemOrderList;

    public OrderListAdapter(ArrayList<OrderListModel> itemOrderList) {
        this.itemOrderList = itemOrderList;
    }

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

    @Override
    public void onBindViewHolder(OrderListViewHolder orderListViewHolder, int position) {
        orderListViewHolder.txtDate.setText(itemOrderList.get(position).getDate());
        orderListViewHolder.txtOrderNumber.setText(itemOrderList.get(position).getOrderNumber());
        orderListViewHolder.txtCustomerName.setText(itemOrderList.get(position).getCustomerName());
        orderListViewHolder.txtProductStatus.setText(itemOrderList.get(position).getProductStatus());
        orderListViewHolder.txtNotes.setText(itemOrderList.get(position).getNotes());
    }

    @Override
    public int getItemCount() {
        return (itemOrderList != null) ? itemOrderList.size() : 0;
//        return itemOrderList.size();
    }

    public class OrderListViewHolder extends RecyclerView.ViewHolder{
        private TextView txtDate, txtOrderNumber, txtCustomerName, txtProductStatus,
                txtNotes;

        public OrderListViewHolder(View itemView) {
            super(itemView);
            txtDate = (TextView) itemView.findViewById(R.id.txt_order_date);
            txtOrderNumber = (TextView) itemView.findViewById(R.id.txt_order_number);
            txtCustomerName = (TextView) itemView.findViewById(R.id.txt_customer_name);
            txtProductStatus = (TextView) itemView.findViewById(R.id.txt_product_status);
            txtNotes = (TextView) itemView.findViewById(R.id.txt_notes);
        }
    }
}

This is the main :

public class OrderListFragment extends Fragment {

    private RecyclerView recyclerView;
    private OrderListAdapter adapter;
    private ArrayList<OrderListModel> OrderListArrayList;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_order_list, container, false);
        getActivity().setTitle(R.string.title_mn_order_list);
        addData();

        recyclerView = (RecyclerView) view.findViewById(R.id.orderList_recycler_view);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this.getActivity());
        recyclerView.setLayoutManager(layoutManager);

        adapter = new OrderListAdapter(OrderListArrayList);
        recyclerView.setAdapter(adapter);
        return view;

    }

    void addData(){
        OrderListArrayList = new ArrayList<>();
        OrderListArrayList.add(new OrderListModel(
                "4 Juli 2018 10:54",
                "0001",
                "Jopa",
                "No",
                "Notes"));
        OrderListArrayList.add(new OrderListModel(
                "4 Juli 2018 10:54",
                "0001",
                "Jopa",
                "Yes",
                "Notes"));

    }
}

Do you have any idea how can i change it?

Assuming, that your ImageView is your indicator bar:

<ImageView
android:id="@+id/ivIndicator" <!-- Add this id -->
android:layout_marginLeft="22dp"
android:layout_marginTop="14dp"
android:layout_marginBottom="14dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/rectangle"/>

Get a reference to it in your OrderListViewHolder:

ivIndicator = (ImageView) itemView.findViewById(R.id.ivIndicator);

And then tint your imageview in onBindViewHolder:

if("Yes".equals(itemOrderList.get(position).getStatus())) {
    orderListViewHolder.ivIndicator.setColorFilter(ContextCompat.getColor(activity, android.R.color.green))
else {
    orderListViewHolder.ivIndicator.setColorFilter(ContextCompat.getColor(activity, android.R.color.red))
}

Make two drawable files like @drawable/rectangle, set it with different color you want.

if(status.equals("No") {  
    yourView.setBackground(context.getResources().getDrawable(R.drawable.rectangleWithRed));
}

else if (status.equals("Yes") {
    yourView.setBackground(context.getResources().getDrawable(R.drawable.rectangleWithGreen);
}
  1. You must give an id to your ImageView say status
  2. In OrderListViewHolder add in your declarations private ImageView status;
  3. In OrderListViewHolder add status = (ImageView) itemView.findViewById(R.id.status);
  4. In OrderListViewHolder add

     if (itemOrderList.get(position).getStatus().equals("Yes")) { orderListViewHolder.status.setBackgroundColor(0x00ff00); } else { orderListViewHolder.status.setBackgroundColor(0xff0000); } 

of course you must create the getStatus() method like all the others getSomething()

if you want to change the color according to the status, then on onBindViewHolder of your Recycler Adapter, check for the status and set to desired color.

if(status.equals("Yes")
{
  rectangleImageView.setColor(Color.GREEN);
}
else
{
  rectangleImageView.setColor(Color.RED);
}
public void onBindViewHolder(OrderListViewHolder orderListViewHolder, int position) {
    if (OrderListModel.getProductStatus().equals("Yes"))    
        rectangleImageView.setColorFilter(getContext().getResources().getColor(R.color.green));
    } else {
        rectangleImageView.setColorFilter(getContext().getResources().getColor(R.color.red));    
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM