Change background colour of current listview item in adapter getView method
Asked Answered
D

8

5

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?

Dodger answered 20/9, 2013 at 12:48 Comment(0)
A
16

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

Achromatous answered 20/9, 2013 at 12:58 Comment(1)
is it possible to add alternate butons??Balf
H
4

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
}
Hames answered 20/9, 2013 at 12:56 Comment(0)
W
3

You can use this code:

 if (position % 2 == 0) {
            holder.image.setBackgroundResource(R.drawable.image1);
        } else {
           holder.image.setBackgroundResource(R.drawable.image2);
        }
Willawillabella answered 20/9, 2013 at 13:20 Comment(0)
T
0

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;

}
Telekinesis answered 20/9, 2013 at 12:57 Comment(0)
F
0

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

Floc answered 16/2, 2015 at 20:26 Comment(0)
M
0
 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));
Marlenemarler answered 7/12, 2016 at 9:59 Comment(0)
C
0

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);
Contraposition answered 2/7, 2019 at 13:19 Comment(0)
T
0

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]))
        }

Trixi answered 24/11, 2022 at 16:33 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.