2010-11-22 11 views
27

tengo una lista Vista en mi aplicación (este es el diseño xml):¿Cómo cambiar el color de los elementos de ListView en el enfoque y en tecleo

<?xml version="1.0" encoding="utf-8"?> 
<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/arrayList" 
     android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
     android:textFilterEnabled="true" 
     android:scrollbars="vertical" 
     android:drawSelectorOnTop="true"> 
</ListView> 

Cada elemento de la lista Vista se compone de dos TextView:

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout android:layout_width="fill_parent" 
     xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/row_container" 
     android:padding="5px" android:layout_height="wrap_content" 
     android:background="@color/white" android:shrinkColumns="0"> 
       <TableRow> 
       <TextView android:layout_height="wrap_content" 
         android:layout_width="wrap_content" android:layout_below="@+id/ 
description" 
         android:id="@+id/description" 
         android:textColor="@color/black" 
         android:scrollHorizontally="true" 
         android:singleLine="true"></TextView> 
     </TableRow> 
     <TableRow> 
       <TextView android:layout_width="wrap_content" 
         android:layout_height="wrap_content" android:id="@+id/result" 
         android:textColor="@color/grey" 
         android:maxLines="1" 
         android:scrollHorizontally="true"></TextView> 
     </TableRow> 

</TableLayout> 

estoy poblando mi vista de lista de una ArrayAdapter, de esta manera:

public class Matches extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    //set layout 

    setContentView(R.layout.list_layout); 
    // obtain reference to listview 
    ListView listView = (ListView) findViewById(R.id.arrayList); 

    ArrayAdapter<Match> arrayAdapter = new ArrayAdapter<Match>(
     this, R.layout.custom_row, R.id.description, createItems()) { 

    @Override 
    public View getView (int position, View convertView, ViewGroup parent){ 
     Match item = getItem (position); 
     LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(R.layout.custom_row, null); 
     TextView description = (TextView)rowView.findViewById(R.id.description); 
     TextView result = (TextView)rowView.findViewById(R.id.result); 
     description.setText(item.description + " Risultato: " + item.result); 
     result.setText(item.date + " " + item.hour); 
     return rowView; 
    } 
    }; 

    listView.setAdapter(arrayAdapter); 

mi objetivo es ser capaz de cambiar el colo de texto r y el fondo de estas vistas secundarias cuando se selecciona o presiona el elemento primario.

¿Cómo puedo hacerlo?

+0

¿Cómo se ajusta el enfoque sin el usuario haga clic? –

Respuesta

36

Las vistas secundarias en la fila de la lista deben considerarse seleccionadas siempre que se seleccione la fila principal, por lo que debería poder establecer un estado normal drawable/color-list en las vistas que desee cambiar, sin código Java sucio necesario. Ver this SO post.

Específicamente, lo haces con la textColor de sus textViews a un recurso XML como éste:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_focused="true" android:drawable="@color/black" /> <!-- focused --> 
    <item android:state_focused="true" android:state_pressed="true" android:drawable="@color/black" /> <!-- focused and pressed--> 
    <item android:state_pressed="true" android:drawable="@color/green" /> <!-- pressed --> 
    <item android:drawable="@color/black" /> <!-- default --> 
</selector> 
+0

Oye, Yoni, ¿qué significa 'setItemsCanFocus (boolean)'? –

5
<selector xmlns:android="http://schemas.android.com/apk/res/android" >  
    <item android:state_pressed="true" android:drawable="@drawable/YOUR DRAWABLE XML" /> 
    <item android:drawable="@drawable/YOUR DRAWABLE XML" /> 
</selector> 
+0

Hey Dhiral, ¿qué significa 'setItemsCanFocus (boolean)'? –

31

En su main.xml incluyen lo siguiente en su ListView:

android:drawSelectorOnTop="false" 

android:listSelector="@android:color/darker_gray" 
+5

La celda de la lista enfocada permanece resaltada después de soltar el toque, si lo hace de esta manera. – Tsimmi

4

Aquí hay un good article sobre cómo usar los selectores con lis ts.

En lugar de dejarlo ser el androide: Fondo del ListView, creo que desea establecer androide: listSelector como se muestra a continuación:

<ListView android:id="@+id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:divider="@null" 
    android:dividerHeight="0dip" 
    android:listSelector="@drawable/list_selector" /> 
1
listview.setOnItemLongClickListener(new OnItemLongClickListener() { 

     @Override 
     public boolean onItemLongClick(final AdapterView<?> parent, View view, 
       final int position, long id) { 
      // TODO Auto-generated method stub 

      parent.getChildAt(position).setBackgroundColor(getResources().getColor(R.color.listlongclick_selection)); 

      return false; 
     } 
    }); 
+0

Sir Many Places Crear excepción de puntero nulo. –

0

muy viejo, pero sólo he tenido problemas con este , así es como lo resolví en xml puro. En res/values ​​/ colors.xml Agregué tres colores (color _...);

<resources> 

    <color name="black_overlay">#66000000</color> 

    <color name="colour_highlight_grey">#ff666666</color> 
    <color name="colour_dark_blue">#ff000066</color> 
    <color name="colour_dark_green">#ff006600</color> 

</resources> 

En el res/carpeta dibujable creé listview_colours.xml que contenía;

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@color/colour_highlight_grey" android:state_pressed="true"/> 
    <item android:drawable="@color/colour_dark_blue" android:state_selected="true"/> 
    <item android:drawable="@color/colour_dark_green" android:state_activated="true"/> 
    <item android:drawable="@color/colour_dark_blue" android:state_focused="true"/> 
</selector> 

En el main_activity.xml encontrar la vista de lista y añadir el dibujable a listSelector;

<ListView 
    android:id="@+id/menuList" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:listSelector="@drawable/listview_colours" 
    android:background="#ff222222"/> 
</LinearLayout> 

jugar con los estatales _... elementos de la listview_colours.xml para conseguir el efecto deseado.

También hay un método en el que se puede establecer el estilo de la vista de lista, pero nunca logró conseguir que funcione

Cuestiones relacionadas