android listview background-color listviewitem

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



background-color listviewitem (7)

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

<?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 mi vista de lista 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 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<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 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?


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 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" />


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 declaración 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));


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

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


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:

<?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>


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 _... );

<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 la carpeta res / drawable 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 main_activity.xml encuentre la Vista de lista y agregue 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>

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


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


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