Mike Baxter
Mike Baxter

Reputation: 7248

Change background colour of current listview item in adapter getView method

I am building a custom adapter for a listview - I would like this adapter to give the listview alternating background colours.

boolean alternate = false;

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

        if (alternate)
        {
            // set background colour of this item?
        }

        alternate = !alternate;

        // lots of other stuff here

        return convertView;     }

How would I set the background of the listview item in context?

Upvotes: 5

Views: 27212

Answers (8)

Sudarsan panda
Sudarsan panda

Reputation: 11

at first, you can create a color list in the adapter like this ->

you can check this image for better clarity...

Photo referencing the location of the lines written below

var colorsList = arrayListOf<String>("#2ecc71", "#e67e22", "#2c3e50", "#e74c3c")

then add this logic (if condition) in onBindviewholder like this, here itemtxt is the id of card view ->

    if (position % 5 == 0) {
            holder.binding.itemtxt.setBackgroundColor(Color.parseColor(colorsList[0]))
        } else if (position % 5 == 1) {
            holder.binding.itemtxt.setBackgroundColor(Color.parseColor(colorsList[1]))
        } else if (position % 5 == 2) {
            holder.binding.itemtxt.setBackgroundColor(Color.parseColor(colorsList[2]))
        } else if (position % 5 == 3) {
            holder.binding.itemtxt.setBackgroundColor(Color.parseColor(colorsList[3]))
        }

Upvotes: 0

Goddard
Goddard

Reputation: 3059

enter image description here I wanted to highlight the solution so people aren't confused.

If you want the colors/image, or whatever alteration done on the listview at draw time you need to set it in the getView like below, but if you want it to show on click you need to do it in an onClick method like below.

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        if(view == null) {
            view = inflater.inflate(R.layout.dashboard_item, parent, false);
        }

        if(selected[position]) {
            view.setBackgroundColor(Color.LTGRAY);
        } else {
            selected[position] = false;
            view.setBackgroundColor(Color.WHITE);
        }
        return view;
    }

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //this is just my custom object..you could also assign your boolean here to see if it is "highlighted"
            Item o = (Item)listView.getItemAtPosition(position);
            if(adapter.selected[position] == true) {
                adapter.selected[position] = false;
                view.setBackgroundColor(Color.WHITE);
            } else {
                adapter.selected[position] = true;
                view.setBackgroundColor(Color.LTGRAY);
            }
     }

My boolean check is just a boolean array like

private boolean[] selected;

I initalize it in the my subclass of the ArrayAdapater constructor.

selected = new boolean[objects.size()];
Arrays.fill(selected, Boolean.FALSE);

Upvotes: 0

koteswara D K
koteswara D K

Reputation: 628

 private int[] colors = new int[] { 0xffD3D3D3, 0xffA9A9A9 };

    inside getView refer the id
     holder._linear_text_active_release_date = (LinearLayout) convertView.findViewById(R.id.relative_text_active_release_date);

holder._linear_text_active_release_status = (LinearLayout) convertView.findViewById(R.id.linear_text_active_release_status); 
add these lines in the getView to set the colour for layout row

holder._linear_text_active_release_status.setBackgroundColor(Color.LTGRA;
            holder._linear_text_active_release_pass.setBackgroundColor(ContextCompat.getColor(context,R.color.amber));

Upvotes: 0

user3532948
user3532948

Reputation: 1

You can do in your adapter

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

        if (convertView == null) {
            inflater = ((Activity) context).getLayoutInflater();
            convertView = inflater.inflate(resourceId, parent, false);
        }
       Person user = getItem(position);

       if(user.isCharged)
       convertView.setBackgroundColor(Color.BLUE);
    }

that will be applied in all your items

Upvotes: 0

Rishabh Srivastava
Rishabh Srivastava

Reputation: 3745

You can use this code:

 if (position % 2 == 0) {
            holder.image.setBackgroundResource(R.drawable.image1);
        } else {
           holder.image.setBackgroundResource(R.drawable.image2);
        }

Upvotes: 3

Amit Gupta
Amit Gupta

Reputation: 8939

Alternate List item background

These are the following steps to do show. Step1.1) Use two selector for odd and even postion list item

artists_list_backgroundcolor.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item
 android:state_selected="false"
    android:state_pressed="false"
    android:drawable="@color/grey" />
<item android:state_pressed="true"
    android:drawable="@color/itemselected" />
<item android:state_selected="true"
 android:state_pressed="false"
    android:drawable="@color/itemselected" />
</selector>

Step 1.2) artists_list_background_alternate.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item
 android:state_selected="false"
    android:state_pressed="false"
    android:drawable="@color/sign_out_color" />
<item android:state_pressed="true"
    android:drawable="@color/login_hover" />
<item android:state_selected="true"
 android:state_pressed="false"
    android:drawable="@color/login_hover" />
</selector>

Step2) colors.xml

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

    <color name="survey_toplist_item">#EFEDEC</color>
    <color name="survey_alternate_color">#EBE7E6</color>
    <color name="grey">#ffffff</color>
    <color name="itemselected">#EDEDED</color>
    <color name="login_hover">#E5F5FA</color>
    <color name="sign_out_color">#e84040</color>

</resources>

Step 3) In Arrayadapter:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.listitem, parent, false);
        }

        if (position % 2 == 0) {
            view.setBackgroundResource(R.drawable.artists_list_backgroundcolor);
        } else {
            view.setBackgroundResource(R.drawable.artists_list_background_alternate);
        }

        ((TextView) view.findViewById(R.id.heading)).setText(data.get(position));

        return view;
    }

For more details go through belog link

http://amitandroid.blogspot.in/2013/03/android-listview-with-alternate-list.html

Upvotes: 16

A.S.
A.S.

Reputation: 4574

Please correct me if I am wrong but I do it this way:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
        convertView = ((LayoutInflater) this._ctx
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                .inflate(this._resource, parent, false);

    }

   switch(position % 3){
      case 0: convertView.setBackgroun....
          break;
      .... (case 1; case 2;)

   }

return convertView;

}

Upvotes: 0

gunar
gunar

Reputation: 14710

You're not going in the right direction as if the views are re-used you might get unexpected results in that some recycled views will have a different colors, while others not.

Instead of above, set the background based on position. Something like:

if(position % 2 == 0) {
    // set some color
} else {
    // set the other color
}

Upvotes: 4

Related Questions