Cómo cambiar el color de los elementos ListView en el foco y al hacer clic

tengo una vista de lista en mi aplicación (este es el diseño xml):

   

Cada elemento de mi vista de lista se compone de dos TextView:

           

Estoy poblando mi listView de un 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 arrayAdapter = new ArrayAdapter( 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 objective es poder cambiar el color del texto y el fondo de estas vistas secundarias cada vez que se selecciona o presiona el elemento principal.

¿Cómo puedo hacerlo?

Las vistas secundarias de 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 de dibujo / lista de colores en las vistas que desee cambiar, sin necesidad de código Java molesto. Ver esta publicación SO .

Específicamente, debe establecer el textColor de sus textViews en un recurso XML como este:

            

En su main.xml, incluya lo siguiente en su ListView:

 android:drawSelectorOnTop="false" android:listSelector="@android:color/darker_gray" 
     

Aquí hay un buen artículo sobre cómo usar selectores con listas.

En lugar de configurarlo para ser el android: fondo de ListView, creo que quieres establecer android: listSelector como se muestra a continuación:

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

Muy viejo, pero acabo de luchar con esto, así es como lo resolví en xml puro. En res / values ​​/ colors.xml agregué tres colores (el color _… );

  #66000000 #ff666666 #ff000066 #ff006600  

En la carpeta res / drawable creé listview_colours.xml que contenía;

        

En main_activity.xml encuentre la Vista de lista y agregue el dibujable a listSelector ;

   

Juega con los elementos de estado _… en el listview_colours.xml para obtener el efecto que deseas.

También hay un método donde puede establecer el estilo de la Vista de lista, pero nunca logré que funcione

Declare los componentes de los elementos de la lista como finales fuera de su setOnClickListener o lo que quiera aplicar en su elemento de la lista como este:

 final View yourView; final TextView yourTextView; 

Y al reemplazar OnClick o cualquier método que use, simplemente configure los colores según sea necesario de esta manera:

 yourView.setBackgroundColor(Color.WHITE/*or whatever RGB suites good contrast*/); yourTextView.setTextColor(Color.BLACK/*or whatever RGB suites good contrast*/); 

O sin la statement final, si digamos que implementa un onClick () para un adaptador personalizado para rellenar una lista, esto es lo que utilicé en getView () para mi setOnClickListener / onClick ():

 //reset color for all list items in case any item was previously selected for(int i = 0; i < parent.getChildCount(); i++) { parent.getChildAt(i).setBackgroundColor(Color.BLACK); TextView text=(TextView) parent.getChildAt(i).findViewById(R.id.item); text.setTextColor(Color.rgb(0,178,178)); } //highlight currently selected item parent.getChildAt(position).setBackgroundColor(Color.rgb(0,178,178)); TextView text=(TextView) parent.getChildAt(position).findViewById(R.id.item); text.setTextColor(Color.rgb(0,178,178));