Android <selector>可以基于对象的状态而不是视图的状态吗?</selector>

时间:2010-08-03 04:43:36

标签: android listview css-selectors

我认为这是一个非常简单的问题,但我很难找到答案......

我正在开发一个Android应用程序(目前正在开发针对v1.5 API),其中一个活动使用ListView。我希望能够根据内存对象的状态而不是视图或列表项的状态来设置每个列表项的属性。

这是一个简单的例子....说我有一个Person类,其公共成员的定义如下:

public class Person {       
    public string getName() {...}

    public boolean isYoung() {...}        
    public boolean isMiddleAged() {...}
    public boolean isOld() {...}
}

就像上面列出的示例一样,我的类中的属性是互斥的(因此只有三个布尔值中的一个可能为真)。现在说我的ListView中的每个List Item都是从Person对象创建的。我目前正在使用自定义ArrayAdapter&lt;人&GT;将Person对象绑定到List View的类(不确定是否重要,但我想提到它)。

我希望能够根据列表视图中绑定的每个Person对象的值设置各种List Item属性(文本颜色和样式以及背景颜色)。就像可能使所有年轻人的背景颜色变绿,中年人变橙,老人变黑。我怎样才能取得这些成果?

更新:感谢您快速回复Cristian C.我一直在尝试实施您的解决方案并继续获得此例外:

  

引起:org.xmlpull.v1.XmlPullParserException:二进制XML文件行#6:<item&gt; tag需要一个'drawable'属性或定义drawable

的子标记

...每次setBackgroundResource()执行时:

public View getView(int index, View convertView, ViewGroup parent) {
    //...stuff here...

   if(person.isYoung())
      view.setBackgroundResource(R.drawable.green);
}

选择器'green.xml'定义如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:background="@color/green" />
</selector>

你是否看到我正在尝试做的任何明显的错误?

感谢您的回复!

1 个答案:

答案 0 :(得分:0)

您必须以编程方式执行此操作。假设您已在XML文件中定义了所有这些选择器;那么你会有这样的事情:

private class YourAdapter extends ArrayAdapter<Person>{
    // foo bar baz
    //...

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

        // more foo bar baz

        if( person.isYoung() )
            view.setBackgroundResource(R.drawable.green);
        else if( person.isMiddledAge() )
            view.setBackgroundResource(R.drawable.orange);
        else if( person.isOld() )
            view.setBackgroundResource(R.drawable.black);// are you racist?  Just kidding

        return view;
    }
}

您可以这样定义选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:drawable="@drawable/green" />
</selector>

绿色可以是名为green.png的可绘制文件夹中的图像。您也可以使用在colors.xml文件(values目录)中定义的纯色来执行此操作:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="orange">#FF5721</color>
</resources>

然后,你会这样做:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:drawable="@color/orange" />
</selector>