Android Alternate row Colors in ListView
Asked Answered
D

4

33
public class ListView extends  ListActivity {

static String item;

public void onCreate(Bundle icicle) {
            super.onCreate(icicle);

            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, Str.S);
            setListAdapter(adapter);

      }

This is my list view class which works nice and it takes the strings from a class called Str and display them in a listview, the problem is the listview style isn't nice, it's black with the strings in white.

I want them to be alternative each row has a color.

I tried many tutorials but none was clear enough .. How do I make Alternative Color for each row .. ex. row1 Blue, row 2 White, row 3 Blue, row 4 White, etc..

Dinner answered 28/10, 2012 at 14:49 Comment(1)
can you give us examples of what you tried? then it will be easier to explain where things went wrongConvoke
T
97

Here is how to do that.

My example code is given here in brief:

Override the getView method in your adapter:

@Override
public View getView(int position, View convertView, ViewGroup parent) {  
View view = super.getView(position, convertView, parent);  
if (position % 2 == 1) {
    view.setBackgroundColor(Color.BLUE);  
} else {
    view.setBackgroundColor(Color.CYAN);  
}

return view;  
}

Override ArrayAdapter and override getView method there.

So if your adapter is something like this:

public class MyAdapter extends ArrayAdapter

Your ListActivity will change like this:

 ArrayAdapter<String> adapter = new MyAdapter<String>(this,
                android.R.layout.simple_list_item_1, Str.S);

Here's an example about overriding ArrayAdapter.

Tuberculosis answered 28/10, 2012 at 14:51 Comment(11)
I tried this, no error but how to implement it to my listview .. ?Dinner
Umm, My whole class is in the question its ListActivity not ArrayAdapter .. IDK what to do i don't have a getView so how i override it ..Dinner
Look, you don't have to override anything ListActivity. Create a new class MyAdapter extending ArrayAdapter. Now in your class shown above change ArrayAdapter to MyAdapter as I mentioned in the answer. That's it! Let me know if you have any more questions.Tuberculosis
Okay, thanks. I get two error. 1- from MyAdapter changed in my class "The type MyAdapter is not generic; it cannot be parameterized with arguments <String>" and from MyAdapter class "Implicit super constructor ArrayAdapter() is undefined for default constructor. Must define an explicit constructor"Dinner
Show me your implementation of ArrayAdapter. i.e. the MyAdapter class.Tuberculosis
You missed the constructor. Create a constructor for MyAdapter.Tuberculosis
there is a lot of constructors which one I choose ? sorry I'm newDinner
The android samples contain a lot of listview examples. Have a look at those, they show you how to implement the adapter in detail.Knockout
See.. Your code in ListActivity is now new MyAdapter<String>(this, android.R.layout.simple_list_item_1, Str.S); So write a constructor like this: MyAdapter (Context context, int resource, String[] values); Updating answer with a link.Tuberculosis
Glad that helped. At StackOverflow, we thank by accepting the answer. (Green tick mark) You're welcome! :)Tuberculosis
Nice solution, and nice reference link you gave there! Worked for me pretty good!Ier
F
4
if (position % 2 == 0) {

    rowView.setBackgroundColor(Color.parseColor("#A4A4A4"));

} else {

    rowView.setBackgroundColor(Color.parseColor("#FFBF00"));

}
Funiculate answered 19/5, 2016 at 10:43 Comment(0)
C
1

The Background color for a custom listview row can be set with

row.setBackgroundResource(R.color.list_bg_2)

method in custom listview adapter in

getView(int position, View convertView, ViewGroup parent)

I have tried many things like row.setBackgroundColor(0xFF00DD) but couldn't get it done,

here list_bg_2 is a color set res/values/color.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="list_bg_1">#ffffff</color>
    <color name="list_bg_2">#fef2e8</color>
</resources>
Chromyl answered 17/12, 2014 at 5:11 Comment(0)
H
0

if view is ViewGroup, simple background setting doesn't work

@Override
public View getView(int position, View convertView, ViewGroup parent) {  
    final int rr = (position % 2 == 0) ? R.color.border_end_1 : R.color.black;
    final int cc = getResources().getColor(rr);
    View view = super.getView(position, convertView, parent);  
    walk(view, rr, cc);
    return view;  
}
private void walk(View view, int rr, int cc){
    view.setBackgroundResource(rr);
    ViewGroup group = (ViewGroup)view;
    int nc = group.getChildCount();
    for (int i = 0; i < nc; i++) {
        final View v = group.getChildAt(i);
        if (v instanceof ViewGroup)
            walk(v, rr, cc);
        else
            v.setBackgroundColor(cc);
    }
}
Hasseman answered 11/3, 2021 at 18:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.