Android ListView elemento seleccionado permanecer destacado

Tengo un XML con dos ListView , uno con una lista de clientes llenados por una consulta select ( lv_cli ) y el otro con los detalles del cliente seleccionado ( lv_cli_det ). Me gustaría mantener el cliente seleccionado en el lv_cli mientras que el lv_cli_det mostrar los detalles.

XML:

 <ListView android:id="@+id/cli_lista" android:layout_width="512dp" android:layout_height="wrap_content" android:fadeScrollbars="false" > </ListView> <ListView android:id="@+id/cli_lista_det" android:layout_width="512dp" android:layout_height="wrap_content" android:layout_toRightOf="@+id/cli_lista" android:fadeScrollbars="false" > </ListView> 

Java:

 Cursor cursor = db.rawQuery("Select NrCl||';'||Nome From Clientes", null); final ListView t = (ListView)findViewById(R.id.cli_lista); ArrayAdapter<String> myarrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, listItems); t.setAdapter(myarrayAdapter); final ListView td = (ListView)findViewById(R.id.cli_lista_detalhe); final ArrayAdapter<String> myarrayAdapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, listItems2); t.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String item = ((TextView)view).getText().toString(); String[] strArray = item.split("\\;"); cli.load(strArray[0].toString()); td.setAdapter(myarrayAdapter2); listItems2.clear(); listItems2.add("Nome: " + cli.getNome()); listItems2.add("Morada: " + cli.getMorada()); listItems2.add("Localidade: " + cli.getLoca()); listItems2.add("Código Postal: " + cli.getCp()); listItems2.add("Pais: " + cli.getPais()); listItems2.add("Nif: " + cli.getNif()); listItems2.add("Tel: " + cli.getTel()); listItems2.add("Tlm: " + cli.getTlm()); listItems2.add("Tipo Preço: " + cli.getTipoPvn()); listItems2.add("Cond. Pagamento: " + cli.getCpg()); listItems2.add("Obs: " + cli.getObs()); td.setAdapter(myarrayAdapter2); myarrayAdapter2.notifyDataSetChanged(); } }); 

Para mantener el color del elemento listview al pulsarlo, incluya la siguiente línea en el diseño del elemento de vista de lista:

 android:background="@drawable/bg_key" 

A continuación, defina bg_key.xml en una carpeta bg_key.xml de la siguiente manera:

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

Finalmente, incluya esto en ListView onClickListener :

 listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position,long arg3) { view.setSelected(true); ... // Anything } }); 

De esta manera, solo se seleccionará un color en cualquier momento. Puede definir sus valores de color en res/values/colors.xml con algo como esto:

 <?xml version="1.0" encoding="utf-8"?> <resources> <color name="pressed_color">#4d90fe</color> <color name="default_color">#ffffff</color> </resources> 

Encontró el camino correcto. Es muy sencillo. En el recurso describe lo siguiente:

 android:choiceMode="singleChoice" android:listSelector="#666666" 

(O puede especificar un enlace de recursos en lugar de un valor de color)

Programación:

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

Modo puede ser uno de estos: AbsListView.CHOICE_MODE_SINGLE, AbsListView.CHOICE_MODE_MULTIPLE, AbsListView.CHOICE_MODE_NONE (predeterminado)

(AbsListView es el ancestro abstracto para la clase ListView)

Las manipulaciones de PS con onItemClick y el fondo de vista cambiante están en quiebra, porque una vista en sí misma es un objeto temporal. Por lo tanto no debe seguir una vista.

Si nuestra lista es suficientemente larga, las vistas asociadas con los elementos desplegados se eliminarán de la jerarquía y se volverán a crear cuando se muestren nuevamente (con opciones de visualización en caché como, por ejemplo, de fondo). Por lo tanto, la vista que hemos rastreado no es ahora una vista real del elemento y cambiar su fondo no hace nada a la vista del elemento real. Como resultado, tenemos varios elementos seleccionados.

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { for (int j = 0; j < adapterView.getChildCount(); j++) adapterView.getChildAt(j).setBackgroundColor(Color.TRANSPARENT); // change the background color of the selected element view.setBackgroundColor(Color.LTGRAY); }); 

Tal vez quiera guardar el elemento seleccionado actual en una variable global utilizando el índice i.

De manera simplista es, si está utilizando listview en un xml, utilice estos atributos en su listview,

 android:choiceMode="singleChoice" android:listSelector="#your color code" 

Si no está usando xml, por programatically

 listview.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); listview.setSelector(android.R.color.holo_blue_light); 

Necesita un selector como este:

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- State when a row is being pressed, but hasn't yet been activated (finger down) --> <item android:drawable="@color/app_primary_color_light" android:state_pressed="true" /> <!-- Used when the view is "activated". --> <item android:drawable="@color/app_primary_color" android:state_activated="true" /> <!-- Default, "just hangin' out" state. --> <item android:drawable="@android:color/transparent" /></selector> 

Y luego establezca android:choiceMode="singleChoice" a su ListView.

Del ejemplo de Avinash Kumar Pankaj

 View v; 

Entonces en el método oncreate

 v = new View(getActivity()); 

Y luego onlistitemclick método escribí

 public void onListItemClick(ListView listView, View view, int position, long id) { v.setBackgroundResource(0); view.setBackgroundResource(R.color.green); v = view; } 

Funcionó para mí. Gracias.

He reemplazado

 v = new View(getActivity()); 

a

 v = new View(this); 

Y el código funcionó bien.

Es necesario los archivos xml 'colors' y 'bg_key' de ejemplos anteriores también, así como el atributo ListView android: background = "@ drawable / bg_key"

Mauro

* Por favor, asegúrese de que no hay Ripple en la configuración de la raíz del contenedor de vista de lista

Agregue esta línea a su vista de lista

 android:listSelector="@drawable/background_listview" 

Aquí está el archivo "background_listview.xml"

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/white_background" android:state_pressed="true" /> <item android:drawable="@color/primary_color" android:state_focused="false" /></selector> 

Los colores que se utilizan en el archivo background_listview.xml:

 <color name="primary_color">#cc7e00</color> <color name="white_background">#ffffffff</color> 

Después de estos

(El elemento seleccionado contiene color naranja hasta que haga clic en otro elemento)

Una manera de hacerlo, es Mantener un registro de la posición actual seleccionada en su actividad:

 @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { currentPosition = position lv_cli.notifyDataSetChanged(); } 

Ahora, asegúrese de asignar un ID al diseño principal (linearLayout, boxLayout, relativeLayout, .. Lo que prefiera) de su elemento de lista.

Entonces en tu ListView puedes hacer algo así:

 layoutBackground = (LinearLayout) convertView.findViewById(R.id.layout_background); if (YourActivity.this.currentPosition == position) { layoutBackground.setBackgroundColor(YourActivity.this.getResources().getColor(R.color.hilight_color)); } else{ layoutBackground.setBackgroundResource(R.drawable.list_item_drawable); } 

Básicamente, sólo tiene que establecer el color de fondo para el diseño como un fondo cuando se iguala a su actual posición seleccionada. Observe cómo configuro un recurso de fondo extraíble cuando el elemento no está seleccionado. Esto podría ser en su caso diferente (ya que no publicó ningún código). En mi caso, este dibujable es un selector que se asegura de que el elemento está iluminado cuando se presiona.

NOTA: Este código simple no utiliza un visor, pero realmente recomiendo usar uno.

Utilice el ID en su lugar:

Este es el método más fácil que puede manejar incluso si la lista es larga:

 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(); ..... 
  • Cómo utilizar AsyncTask
  • Cómo dibujar liso / camino redondeado?
  • Método del ciclo de vida del bloqueo de actividad - android
  • ¿Distancia más corta de Levenshtein? ¿Lo necesito?
  • Android calcula la distancia entre dos ubicaciones
  • Código fuente de APK
  • ¿Los hilos son lo suficientemente fiables para calcular segundos?
  • Cómo analizar XML utilizando el analizador SAX
  • Android: ¿Cómo ignorar o desactivar savedInstanceState?
  • Aplicación de chat Bluetooth de Android que se conecta a Bluegiga WT-12
  • Encontrar el modelo de dispositivo y hacer
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.