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:
- Deshabilitar el modo horizontal para una aplicación completa
- ¿Cómo hacer una solicitud de POST utilizando retrofit 2?
- Android Cómo sincronizar dos tareas asíncronas?
- ClassCastException: ApiVersionImpl no se puede transmitir a java.lang.Integer
- Android Multitouch - Determina qué dedo levantado?
<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(); } });
- Tipo no coincidente: no se puede convertir de StringBuilder a String
- Retrofit-IllegalArgumentException: url inesperada
- Excepción con la deserialización del marco XML simple
- ¿Cómo leer el contenido de la ventana (usando accessibilityService) y evocando la interfaz de usuario mediante el uso de permiso de otra aplicación en Android?
- Persistencia de una clase Collection con ORMLite en android
- Android WifiManager getScanResult se queja Necesita el permiso ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION aunque el permiso declarado
- Facebook Login / Google Login - ¿La misma actividad?
- Configurar la aplicación en facebook Error: "La aplicación está mal configurada para iniciar sesión en Facebook .."
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(); .....