Android ListView中的交替行颜色

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);

      }

这是我的列表视图类,它很好地运作,并从名为Str的类中获取字符串并在列表视图中显示它们。问题是列表视图样式不够好看,它是黑底白字。

我希望它们可以交替着有颜色,每行有一种颜色。

我尝试了许多教程,但都不够清晰。如何使每行具有交替的颜色,例如第1行蓝色,第2行白色,第3行蓝色,第4行白色等等?


1
你能给我们一些你尝试过的例子吗?这样解释出问题出在哪里就会更容易些。 - Sheena
4个回答

97

这里介绍如何做到这一点。

我的示例代码简述如下:

在您的适配器中覆盖getView方法:

@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;  
}

重写ArrayAdapter并在那里覆盖getView方法。

所以,如果您的适配器类似于以下内容:

public class MyAdapter extends ArrayAdapter

你的ListActivity将会变成这样:

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

这里有一个示例,介绍如何重写ArrayAdapter。


1
我尝试过了,没有错误,但如何将其实现到我的列表视图中呢? - Yerry Huntry
1
嗯,我的整个类都在问题中,它不是ArrayAdapter而是ListActivity..我不知道该怎么办,因为我没有getView,所以我该如何覆盖它.. - Yerry Huntry
1
看,你不需要覆盖ListActivity中的任何内容。创建一个新类MyAdapter扩展ArrayAdapter。现在,在你上面展示的类中,将ArrayAdapter更改为我在答案中提到的MyAdapter即可。就这样!如果你有更多问题,请让我知道。 - Suraj Bajaj
1
好的,谢谢。我得到了两个错误。1-来自我的类中更改的MyAdapter,“类型MyAdapter不是泛型;它不能用参数<String>进行参数化”,以及来自MyAdapter类的“隐式超级构造函数ArrayAdapter()未定义默认构造函数。必须定义一个显式构造函数”。 - Yerry Huntry
1
请展示您的ArrayAdapter实现,即MyAdapter类。 - Suraj Bajaj
显示剩余6条评论

4
if (position % 2 == 0) {

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

} else {

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

}

1
自定义列表视图行的背景颜色可以使用以下方式设置:
row.setBackgroundResource(R.color.list_bg_2)

自定义ListView适配器中的方法。
getView(int position, View convertView, ViewGroup parent)

我尝试了很多方法,比如row.setBackgroundColor(0xFF00DD),但是无法完成。
这里的list_bg_2是一个颜色集合,位于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>

0
如果视图是ViewGroup,则简单的背景设置不起作用。
@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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接