Cómo resaltar la fila en ListView en Android?

Tengo que resaltar una fila en un ListView que fue seleccionado (para mostrar al usuario lo que eligió), por lo que no es el que va a ser elegido, es el que él eligió antes.

Ya tengo la ubicación por:

 ListView.setSelection(position); 

Y ahora lo que quiero es seleccionar esta fila específica y resaltarla.

El código de la onCreate() en la actividad que contiene el ListView :

 public class CountryView extends Activity { protected static final String LOG_TAG = null; /** Called when the activity is first created. */ String[] lv_arr = {}; ListAdapter adapter; TextView t; private ListView lvUsers; private ArrayList<Coun> mListUsers; String responce=null; public int d; int selectedListItem = -1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.country); Intent data =getIntent(); mListUsers = getCoun(); lvUsers = (ListView) findViewById(R.id.counlistView); lvUsers.setAdapter(new ListAdapter(this, R.id.counlistView, mListUsers)); selectedListItem=data.getExtras().getInt("PositionInList"); lvUsers.setChoiceMode(ListView.CHOICE_MODE_SINGLE); lvUsers.setOnItemClickListener(new OnItemClickListener() { int positionItem; public void onItemClick(AdapterView<?> parent, View view,int position, long id) { Intent pongIntent = new Intent(getApplicationContext(),Trav.class); int counId=mListUsers.get(position).id; pongIntent.putExtra("response",mListUsers.get(position).p); pongIntent.putExtra("responseCounID",counId); //Put the position of the choose list inside extra positionItem=position; pongIntent.putExtra("PositionInListSet",positionItem); setResult(Activity.RESULT_OK,pongIntent); Log.i("CounID *******************************"," "+counId); finish(); } }); } } 

Puesto que por defecto ListViews se establecen en un modo de selección de NONE , en el modo táctil el método setSelection no tendrá efecto visual.

Para mantener la selección anterior / mostrar visualmente una selección explícita, en primer lugar debe establecer el modo de selección de su listview apropiadamente:

 listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Es útil leer los Documentos de API de estos métodos:

  • SetSelection
 void android.widget.AdapterView.setSelection(int position) 

Establece el elemento seleccionado actualmente. Para dar soporte a las subclases de accesibilidad que anulan este método, primero debe invocar el super método superado.

Parámetros :
position Índice (a partir de 0) del elemento de datos a seleccionar.

  • SetChoiceMode
 void android.widget.ListView.setChoiceMode(int choiceMode) 

Define el comportamiento de elección de la Lista. De forma predeterminada, las listas no tienen ningún comportamiento de elección ( CHOICE_MODE_NONE ). Al establecer el choiceMode en CHOICE_MODE_SINGLE , la lista permite que hasta un elemento esté en un estado elegido. Al establecer el choiceMode en CHOICE_MODE_MULTIPLE , la lista permite seleccionar cualquier número de elementos.

Parámetros :
choiceMode Uno de CHOICE_MODE_NONE , CHOICE_MODE_SINGLE o CHOICE_MODE_MULTIPLE

En caso de que esto no sea suficiente (diga que desea mostrar siempre la última selección de forma diferente al lado de la selección actual), debe almacenar el último elemento seleccionado (un dato que rellena el ListAdapter ) como lastSelectedItem y asignar el método getView del adaptador Un recurso de fondo diferente al renderizador si es igual a este lastSelectedItem .

Si su última selección no se actualizara en el cambio de selección, debería llamar explícitamente al método notifyDataSetChanged en la instancia del adaptador.

Actualizar
Puesto que su actividad que contiene el ListView es un hijo de una actividad que espera el resultado de este (basado en el setResult(Activity.RESULT_OK,pongIntent); la idea inicial es correcta, la última posición debe ser pasada a través de la intención cuando Inicio de la actividad:

 selectedListItem = getIntent().getIntExtra("PositionInList", -1); lvUsers.setChoiceMode(ListView.CHOICE_MODE_SINGLE); lvUsers.setSelection(selectedListItem); 

La solución ListView.CHOICE_MODE_SINGLE funcionaría si permaneces en la misma actividad, pero lo estás finalizando en cada itemClick (cambio de selección), por eso los datos adicionales se deben pasar al Intent inicial.

También puede configurar el fondo del elemento previamente seleccionado desde su adaptador -como se mencionó anteriormente-, reemplazando su método getView :

 lvUsers.setAdapter(new ArrayAdapter(this, R.id.counlistView, groups) { @Override public View getView(int position, View convertView, ViewGroup parent) { final View renderer = super.getView(position, convertView, parent); if (position == selectedListItem) { //TODO: set the proper selection color here: renderer.setBackgroundResource(android.R.color.darker_gray); } return renderer; } }); 

Sólo:

  1. Establezca el modo de selección correcto en la vista de lista. setChoiceMode
  2. Establecer un fondo para apoyar el estado de selección en el diseño del elemento, como:

     android:background="?android:attr/activatedBackgroundIndicator" 

FYI:

Es mucho más fácil implementar esto en los archivos de diseño y dejar que Android maneje el resto …

1) Asegúrese de tener android:choiceMode="" establecido en su diseño ListView ( singleChoice , multipleChoice , etc). De forma predeterminada, se establece en none .

 <ListView android:id="@+id/invite_friends_fragment_contacts_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:choiceMode="multipleChoice"/> <!-- THIS LINE --> 

2) Cree un archivo XML selector de estado y guárdelo en su carpeta drawables. En este ejemplo, lo llamaremos state_selector.xml :

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

3) En el diseño del elemento de lista , agregue el archivo state_selector.xml como fondo:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/state_selector"> <!-- THIS LINE --> <!-- ALL OF YOUR ELEMENTS WILL GO HERE (TextViews, ImageViews, etc) --> </RelativeLayout> 

Si está utilizando multipleChoice , puede sobrescribir onItemClick() y establecer / desactivar los elementos seleccionados en consecuencia . Android cambiará el color de fondo especificado en el archivo state_selector.xml.

Tuve un problema para encontrar una solución fácil a esto porque tantos tutoriales y respuestas contenían información sobre una sola selección a través de botones de radio (que dependía en gran medida de RadioGroup).

Mi problema era que podría fijar el artículo a mi "destacado" estado pero después no podría reajustar la lista cuando el artículo siguiente fue seleccionado. Aquí es lo que me ocurrió:

 listView.setOnItemClickListener(new ItemHighlighterListener ()); 

Con esta clase:

 private class ItemHighlighterListener implements OnItemClickListener{ private View lastSelectedView = null; public void clearSelection() { if(lastSelectedView != null) lastSelectedView.setBackgroundColor(android.R.color.transparent); } @Override public void onItemClick(AdapterView<?> arg0, View view, int arg2, long arg3) { clearSelection(); lastSelectedView = view; view.setBackgroundDrawable(view.getContext().getResources().getDrawable(R.drawable.shape_selected_menu_item)); } } 

Resuelvo este problema de la siguiente manera: 1. establecer un lastClickId, cuando haga clic en el elemento en listView, actualizar el lastClickId a valor de posición, a continuación, actualizar el fondo de la vista. Después de esto, cuando hacemos clic en un elemento, este elemento se resaltará, pero cuando se desplaza el listView (hacer el elemento que hemos seleccionado fuera de la pantalla) y desplazarse hacia atrás, el resaltado se ha ido, porque el método getView () volver a ejecutar en Su adaptador, por lo que, tenemos que hacer lo siguiente. 2. en su adaptador, cambie el fondo en el método getView (), aquí está el código:

 private static int lastClickId = -1; private OnItemClickListener listener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if ((lastClickId != -1) && (lastClickId != position)) { parent.getChildAt(lastClickId).setBackgroundResource( R.color.grey); view.setBackgroundResource(R.color.blue); } if (lastClickId == -1) { view.setBackgroundResource(R.color.blue); } lastClickId = position; } }; public static int getCurrentSelectedItemId() { return lastClickId; } 

Adaptador:

 public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View view = mInflater.inflate(R.layout.tweet_list_layout, null); // set selected item's background to blue if (position == MainUserFeedFragment.getCurrentSelectedItemId()) { view.setBackgroundResource(R.color.blue); } } 

¿Por qué no almacenar las selecciones en una matriz, a continuación, pasar esa matriz en el constructor de la ListView Array Adapter, algo como myArrayAdapter(context,layoutID,dataArray,selectionArray)

Entonces en su método getView para el arrayadapter, simplemente haga una comprobación. Por ejemplo en pseudocódigo

 if row was previously selected change background color 

Puede utilizar la transición. Siga mi código, porque he logrado resaltar el elemento de lista específica por elección Vamos a decir que desea resaltar el primer elemento durante 5 segundos.

  if(position == 0){ viewHolderThubnail.relImage.setBackgroundResource(R.drawable.translate); TransitionDrawable transition = (TransitionDrawable) viewHolderThubnail.relImage.getBackground(); transition.startTransition(1000); }else{ viewHolderThubnail.relImage.setBackgroundResource(R.color.white); } 

Traducir.xml

 <?xml version="1.0" encoding="UTF-8"?> <transition xmlns:android="http://schemas.android.com/apk/res/android"> <!-- The drawables used here can be solid colors, gradients, shapes, images, etc. --> <item android:drawable="@drawable/new_state" /> <item android:drawable="@drawable/original_state" /> </transition> 

New_state.xml

 <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#92BCE7"/> </shape> 

Original_state.xml

 <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#FFFFFF"/> </shape> 

Si entendió este código, que es muy simple debo decir, entonces el elemento de vista de lista en la posición cero se resaltará en color azul durante 5 segundos y luego se desvaneció a color blanco.

El más simple de todos

Ver updatedview = null;

  @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //these two lines of code means that only one item can be selected at a time if(updatedview != null) updatedview.setBackgroundColor(Color.TRANSPARENT); updatedview=view; Toast.makeText(getApplicationContext(), " " + str[position], Toast.LENGTH_LONG).show(); view.setBackgroundColor(Color.CYAN); } 
  • Android Java; ¿Cómo puedo analizar un archivo JSON local de carpeta de activos en un ListView
  • Listview con CursorAdapter
  • Android: requestLayout () incorrectamente llamado
  • Fuerza onSizeChanged para ListView
  • Aplicar estilo a Android ListView
  • Android: ¿Gridview o listview?
  • Ormlite, listViews y adaptadores?
  • Espaciado entre los elementos de listView Android
  • Creación de una vista redimensionable ListAdapter-recycleable
  • ¿Cómo obtener información sobre el toque de RecyclerView?
  • Mantenimiento de un ListView donde cada elemento de lista tiene una relación de uno a muchos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.