layout_width gridlayout examples ejemplo dinamico constraint android android-layout

android - gridlayout - Cambiar el color de fondo del elemento seleccionado en un ListView



table layout android (15)

Quiero saber cómo puedo cambiar el color de fondo del elemento seleccionado en mi lista Vista. Solo quiero cambiar el elemento específico en el que hizo clic el usuario, lo que significa que si el usuario hace clic en otro elemento, será el que esté resaltado. Bueno, como quiero que sea lo más simple posible y use la vista de lista android predeterminada, usé este código:

record_list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { try{ for (int ctr=0;ctr<=record_items.length;ctr++){ if(i==ctr){ record_list.getChildAt(ctr).setBackgroundColor(Color.CYAN); }else{ record_list.getChildAt(ctr).setBackgroundColor(Color.WHITE); } } } catch (Exception e){ e.printStackTrace(); } Log.v("Selected item",record_list.getItemAtPosition(i)); } });

Ok, este funciona, pero el problema es que es lento. Ahora quiero saber si hay otra manera de hacerlo que pueda dar el mismo resultado que hice.

Intenté usar record_list.getSelectedView().setBackgroundColor(Color.CYAN); pero me da una excepción de puntero nulo.

También probé el selector.xml pero tampoco funcionó. Además, hay una propiedad aquí en ListView que se llama listSelector. Es un dibujante como lo dice la documentación "Drawable utilizado para indicar el elemento seleccionado actualmente en la lista". También creo que esto debería ser el truco y sí, funciona bien en mi emulador pero no en mi pestaña de galaxias. También probé los otros métodos, pero nada funciona como yo quería.


En un conjunto ListView:

android:choiceMode="singleChoice"

Crea un selector para un fondo (drawable / selector_gray.xml):

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/gray" android:state_checked="true" /> <item android:drawable="@color/white" /> </selector>

Agregue un artículo para una lista:

<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="5dp" android:background="@drawable/selector_gray" android:textColor="@color/colorPrimary" tools:text="Your text" />

En un ViewHolder puedes inflar este artículo.


Este es un método simple que puede manejar la selección incluso si la lista es larga también:

public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub Holder holder=new Holder(); View rowView; rowView = inflater.inflate(R.layout.list_item, null); //Handle your items. //StringHolder.mSelectedItem is a public static variable. if(getItemId(position)==StringHolder.mSelectedItem){ rowView.setBackgroundColor(Color.LTGRAY); }else{ rowView.setBackgroundColor(Color.TRANSPARENT); } return rowView; }

Y luego en tu onclicklistener:

list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { StringHolder.mSelectedItem = catagoryAdapter.getItemId(i-1); catagoryAdapter.notifyDataSetChanged(); .....


La forma más simple que he encontrado:

en su actividad XML agregue estas líneas:

<ListView ... android:choiceMode="singleChoice" android:listSelector="#666666" />

o establezca programáticamente estas propiedades:

listView.setSelector(Drawable selector) listView.setSelector(int resourceId)

Mi ejemplo particular:

<ListView android:choiceMode="singleChoice" android:listSelector="#666666" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/listView"/>

gracias a AJG: https://.com/a/25131125/1687010


Para aquellos que se preguntan qué se debe hacer EXACTAMENTE para mantener las filas seleccionadas incluso mientras se desplaza hacia abajo. Es el estado_activado El resto se ocupa de la funcionalidad interna, no tiene que preocuparse por alternar y puede seleccionar varios elementos. No necesité utilizar los métodos notifyDataSetChanged () o setSelected (true).

Agregue esta línea a su archivo selector, para mí drawable / row_background.xml

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

Luego, en layout / custom_row.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="10dip" android:background="@drawable/row_background" android:orientation="vertical"> <TextView android:id="@+id/line1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>

Para obtener más información, estoy usando esto con el adaptador ListView, usando myList.setChoiceMode (ListView.CHOICE_MODE_MULTIPLE_MODAL); y myList.setMultiChoiceModeListener (nuevo MultiChoiceModeListener () ...

de este ejemplo: http://www.androidbegin.com/tutorial/android-delete-multiple-selected-items-listview-tutorial/

Además, debe (debería) usar esta estructura para su acoplamiento de adaptador de lista: List myList = new ArrayList ();

en lugar de: ArrayList myList = new ArrayList ();

Explicación: Lista de tipos frente a tipo ArrayList en Java


Primero puede crear el archivo selector xml como se muestra a continuación en su carpeta drawable/list_item_selector.xml

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true"> <shape android:shape="rectangle"> <solid android:color="#333333" /> <padding android:left="5dp" android:right="5dp" /> </shape></item> <item><shape android:shape="rectangle"> <solid android:color="#222222" /> </shape></item> </selector>

Y luego en su vista de lista especifique el fondo como

android:background="@drawable/list_item_selector"


Puede seguir la posición del elemento seleccionado actual:

OnItemClickListener listViewOnItemClick = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapter, View arg1, int position, long id) { mSelectedItem = position; mAdapter.notifyDataSetChanged(); } };

Y anule el método getView de su adaptador:

@Override public View getView(int position, View convertView, ViewGroup parent) { final View view = View.inflate(context, R.layout.item_list, null); if (position == mSelectedItem) { // set your color } return view; }

Para mí, fue el truco.


Puedes usar un selector. Cambie los valores de los colores y modifique los siguientes según sus necesidades.

bkg.xml en una carpeta dibujable

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/pressed" /> <item android:state_focused="false" android:drawable="@drawable/normal" /> </selector>

pressed.xml en una carpeta dibujable

<?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FF1A47"/> // color <stroke android:width="3dp" android:color="#0FECFF"/> // border <padding android:left="5dp" android:top="5dp" android:right="5dp" android:bottom="5dp"/> <corners android:bottomRightRadius="7dp" // for rounded corners android:bottomLeftRadius="7dp" android:topLeftRadius="7dp" android:topRightRadius="7dp"/> </shape>

normal.xml en la carpeta dibujable

<?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FFFFFF"/> <stroke android:width="3dp" android:color="#0FECFF" /> <padding android:left="5dp" android:top="5dp" android:right="5dp" android:bottom="5dp"/> <corners android:bottomRightRadius="7dp" android:bottomLeftRadius="7dp" android:topLeftRadius="7dp" android:topRightRadius="7dp"/> </shape>

Establecer el fondo dibujable para el diseño personalizado de la vista de lista para inflarse para cada fila

Recomiendo usar una vista de lista personalizada con un adaptador personalizado.

android:background="@drawable/bkg"

Si no ha utilizado un adaptador personalizado, puede configurar el selector de lista para mostrar como se muestra a continuación

android:listSelector="@drawable/bkg"


Sé que esta es una vieja pregunta, pero ofrezco una solución simple para esta necesidad (¡sin bucles!):

//On your adapter create a variable: private View lastSelectedItem; //Define the folowing method: private void toggleBackgroundItem(View view) { if (lastSelectedItem != null) { lastSelectedItem.setBackgroundColor(Color.TRANSPARENT); } view.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark)); lastSelectedItem = view; } //finally invoque the method onItemClick lvSac.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick (AdapterView < ? > adapterView, View view,int i, long l){ toggleBackgroundItem(view); } }


Si desea que el elemento permanezca resaltado después de haber hecho clic en él, debe configurarlo manualmente como seleccionado en el oyente onItemClick.

Lista de Android El elemento seleccionado permanece resaltado :

myList.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { view.setSelected(true); // <== Will cause the highlight to remain //... do more stuff }});

Esto supone que tiene un elemento state_selected en su selector:

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


También estoy haciendo lo mismo: resalte el fondo del elemento de la lista seleccionada (cámbielo a rojo) y establezca el color del texto en blanco.

Puedo pensar en una forma " simple pero no eficiente ": mantener la posición de un elemento seleccionado en el adaptador personalizado y cambiarlo en el implemento OnItemClickListener de ListView:

// The OnItemClickListener implementation @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mListViewAdapter.setSelectedItem(position); } // The custom Adapter private int mSelectedPosition = -1; public void setSelectedItem (int itemPosition) { mSelectedPosition = itemPosition; notifyDataSetChanged(); }

A continuación, actualice el color del fondo y el texto del elemento seleccionado en el método getView() .

// The custom Adapter @Override public View getView(int position, View convertView, ViewGroup parent) { ... if (position == mSelectedPosition) { // customize the selected item''s background and sub views convertView.setBackgroundColor(YOUR_HIGHLIGHT_COLOR); textView.setTextColor(TEXT_COLOR); } else { ... } }

Después de buscar por un tiempo, descubrí que muchas personas mencionaron establecer android:listSelector="YOUR_SELECTOR" . Después de probar por un tiempo, encontré que la manera más sencilla de resaltar el fondo del elemento ListView seleccionado se puede hacer con solo dos líneas establecidas en el recurso de diseño de ListView:

android:choiceMode="singleChoice" android:listSelector="YOUR_COLOR"

También hay otra forma de hacerlo funcionar, como personalizar el tema activatedBackgroundIndicator . Pero creo que sería una solución mucho más genérica, ya que afectará a todo el tema.


Utilice el siguiente xml como fondo de lista de temas para resolver todos los problemas. El seleccionado se resaltará aunque se haya desplazado hacia abajo.

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

Gracias, Nagendra


supongamos que quiere que se haga clic en un elemento cada vez. Entonces este código funciona bien. Tomemos el nombre listview como stlist

stList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override // here i overide the onitemclick method in onitemclick listener public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //color change //selected item colored for(int i=0; i<stList.getAdapter().getCount();i++) { stList.getChildAt(i).setBackgroundColor(Color.TRANSPARENT); } parent.getChildAt(position).setBackgroundColor(Color.GRAY); });


Definir variable

private ListView mListView;

Inicializar la variable

mListView = (ListView)findViewById(R.id.list_view);

OnItemClickListener de listview

mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adpterView, View view, int position, long id) { for (int i = 0; i < mListView.getChildCount(); i++) { if(position == i ){ mListView.getChildAt(i).setBackgroundColor(Color.BLUE); }else{ mListView.getChildAt(i).setBackgroundColor(Color.TRANSPARENT); } } } });

Construye y ejecuta el proyecto - Hecho


Método 1:

Actualice ListView en su actividad / fragmento de diseño xml:

<ListView ... android:choiceMode="singleChoice" android:listSelector="@android:color/darker_gray" />

Eso es todo, ¡listo!

Si quieres una forma programática para manejar esto, utiliza el método 2 ...

Método 2:

Si está utilizando un ListFragment, puede anular onListItemClick (), usando la vista para establecer el color. Guarde la vista actual seleccionada para restablecer el color de la última selección.

Tenga en cuenta que esto solo funciona en listas que caben en una pantalla, ya que la vista se recicla.

public class MyListFragment extends ListFragment { View previousSelectedItem; ... @Override public void onListItemClick(ListView parent, View v, int position, long id) { super.onListItemClick(parent, v, position, id); if (previousSelectedItem!=null) { previousSelectedItem.setBackgroundColor(Color.WHITE); } previousSelectedItem=v; v.setBackgroundColor(Color.BLUE); } }


View updateview;// above oncreate method listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override `enter code here`public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (updateview != null) updateview.setBackgroundColor(Color.TRANSPARENT); updateview = view; view.setBackgroundColor(Color.CYAN); } });