2010-08-03 1 views
1

Я думаю, что это довольно простой вопрос, но у меня проблемы с поиском ответа там ...Может ли Android <selector> основываться на состоянии объекта, а не на состоянии представления?

Я разрабатываю приложение для Android (в настоящее время разрабатывает API v1.5), и один из видов деятельности ListView. Я хочу иметь возможность устанавливать свойства каждого элемента списка на основе состояния объекта с памятью, а не состояния представления или элемента списка.

Вот простой пример .... что у меня есть класс, человек, который общественные члены определяются следующим образом:

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

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

Так же, как, например, описанной выше свойства в моем классе являются взаимоисключающими (так только один из трех булевых значений может быть правдой). Теперь скажите, что каждый элемент списка в моем ListView создан из объекта Person. В настоящее время я использую пользовательский класс ArrayAdapter < Person> для привязки объектов Person к представлению списка (не уверен, что это важно или нет, но я думал об этом упомянуть).

Я хочу иметь возможность устанавливать различные свойства элемента списка (цвет текста и стиль и цвет фона) на основе значений каждого объекта Person, связанного в представлении списка. Как возможно, делая цвет фона всех молодых людей зелеными, людьми среднего возраста апельсинами и старыми людьми черными. Как я могу достичь этих результатов?

UPDATE: Спасибо за ваш ответ скорейшего Cristian C. Я пытался реализовать свое решение и продолжать получать это исключение:

Вызванный: org.xmlpull.v1.XmlPullParserException: двоичный файл XML строка # 6: тег <item> требует 'рисуем' атрибут или дочерний тег, определяющий 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> 

Видите ли вы какие-либо вопиющие ошибки с тем, что я пытаюсь сделать?

Спасибо за ваши ответы!

ответ

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> 
+0

Спасибо за ответ Cristian ... смотрите мой Обновить. Еще раз спасибо! – MoMo

+0

Я не видел твой комментарий ... Я обновлю свой ответ ... – Cristian

+0

Perfect !! Еще раз спасибо за вашу помощь =) – MoMo

Смежные вопросы