2016-01-10 2 views
2

Я делаю игру, которая будет использовать Listview, чтобы отобразить текст в чате.Android - изменение цвета фона определенного элемента ListView

Некоторые из этих текстов представляют события, поэтому я хочу изменить их цвет фона в соответствии с этим конкретным событием: EX. Кто-то погибает, , что специфическое для Listview «S будет иметь красный цвет фона

Как этого добиться?

Это мой JAVA код:

  //STARTING SETUP 
     ArrayList<String> arrayListMother; 
     ArrayAdapter<String> arrayAdapterMother; 
     ListView listViewMother; 

     int counter; 
     boolean introDone = false; 

     String[] night = {"Welcome!","This is Lupus In Tabula!","You're gonna experience the Hasbro Game in a total new way, have fun!"}; 
     String[] day = {"Thank you!","Great","Let's do it!"}; 
     String[] dead = {"Thank you!","Great","Let's do it!"}; 
     String[] saved = {"Thank you!","Great","Let's do it!"}; 

     Button buttonGo; 
     //ENDING SETUP 


     //CREATE - CREATE// 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_game); 
      setup(); 

     } 
     //CREATE - CREATE// 


    public void setup(){ 

    arrayListMother = new ArrayList<String>(); 
    arrayAdapterMother = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayListMother); 
    listViewMother = (ListView) findViewById(R.id.list_mother); 
    listViewMother.setAdapter(arrayAdapterMother); 
    buttonGo = (Button)findViewById(R.id.buttonGo); 
} 

И это мой XML-код:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical"> 

<ListView 
    android:id="@+id/list_mother" 
    android:text="@string/go" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:textAppearance="?attr/textAppearanceListItem" 
    android:divider="@null" 
    android:layout_weight="7"/> 

<Button 
    android:id="@+id/buttonGo" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    android:text="@string/go" 
    android:textColor="@color/white" 
    android:background="@color/colorPrimary" 
    android:enabled="true" 
    android:onClick="play" /> 
</LinearLayout> 
+0

Вы можете сделать это легко с классом модели, имеющие и присваивателя для цвета и с позиции (индекс ListItem) – Raghunandan

+0

Могу ли я попросить примера @Raghunandan – FET

+0

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

ответ

2

Override getView для ArrayAdapter. Исходя из условия изменения цвета или выполнения необходимых действий. Вы уже предоставили параметры для конструктора ArrayAdapter. Поэтому нет необходимости снова раздувать представление. Получите то же самое и сделайте то, что требуется. Аналогично getItem(position) Получите данные в заданном положении.

http://developer.android.com/reference/android/widget/ArrayAdapter.html#getItem(int)

listViewMother.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayListMother) { 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = super.getView(position, convertView, parent); 

    if(getItem(position).equals("Somebody gets killed")) 
    { 
     // do something change color 
     row.setBackgroundColor (Color.RED); // some color 
    } 
    else 
    { 
     // default state 
     row.setBackgroundColor (Color.WHITE); // default coloe 
    } 
    return row; 
    } 
}); 
+0

Эй, как бы я получил автоматически текущую позицию нового элемента, который я собираюсь добавить? Я создаю метод redEvent(), который принимает в качестве параметров String для сообщения, а затем он должен повернуть фон этого элемента красным цветом, как мне получить позицию или сосредоточиться на этом элементе? Спасибо – FET

+0

Вы получаете текущую позицию элемента в getView. см. первый параметр. Если вы добавляете новый элемент, который вы можете добавить в список. getItem (Position) получит элемент в этой позиции, который является строкой, и сравнивает его с SomeBody, который будет убит, если он будет равен фону, станет красным – Raghunandan

+0

Да, я хочу повернуть красный элемент не путем сравнения строк, а istantly когда я добавляю их с помощью метода «redEvent()». Итак, вопрос, вне этого адаптера, как мне получить позицию нового элемента, который я создаю в одно и то же время? – FET

4

использовать этот код:

listViewMother.getChildAt(position).setBackgroundColor(
      Color.parseColor("#00743D")); 
1

В классе адаптера, где вы зывать вид, вы можете проверить наличие конкретного состояния и установите цвет в следующих way.This образом, вы можете установить цвет текста или фона динамически. Надеюсь это поможет. Я использую recycler viewer здесь, который над ездит на BindViewHolder. У вашего адаптера должен быть метод, который связывает представление.

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    Person person = personList.get(position); 

    holder.username.setText(person.getName()); 
    holder.arriveTime.setText(DateFormat.format("hh:mm a",(person.getArriveTime() * 1000))); 


    if(person.getName().equals("NoVisitor")) 
    { 
     holder.username.setTextColor(Color.GRAY); 
     holder.arriveTime.setTextColor(Color.GRAY); 
     holder.leaveTime.setTextColor(Color.GRAY); 
    } 
    else 
    { 
     holder.username.setTextColor(Color.BLACK); 
     holder.arriveTime.setTextColor(Color.BLACK); 
     holder.leaveTime.setTextColor(Color.BLACK); 
    } 
} 
Смежные вопросы