tutorial studio llenar example custom activity java android android-listview

java - studio - Android ListView elemento seleccionado permanecer resaltado



listview android studio (9)

Tengo un XML con dos ListView , uno con una lista de clientes rellenada por una consulta de selección ( lv_cli ) y el otro con los detalles del cliente seleccionado ( lv_cli_det ). Me gustaría mantener al cliente seleccionado en lv_cli mientras que lv_cli_det muestra 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(); } });


* por favor, asegúrese de que no haya una ondulación en el diseño 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 usaron en el archivo background_listview.xml:

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

después de estos

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


De manera simplista, si usa listview en un xml, use estos atributos en su vista de lista,

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

si no usa xml, por programatically

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


Del ejemplo de Avinash Kumar Pankaj

View v;

luego al método oncreate

v = new View(getActivity());

y luego el método onlistitemclick 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.

Reemplacé

v = new View(getActivity());

a

v = new View(this);

y el código funcionó bien.

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

Mauro


Encontrado el camino correcto. Es muy sencillo. En recursos, describa lo siguiente:

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

(o puede especificar un enlace de recurso en lugar de un valor de color)

Programado:

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 de 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 rastrear una vista.

Si nuestra lista es lo suficientemente larga, las vistas asociadas con los elementos desplazados se eliminarán de la jerarquía y se recrearán cuando esos elementos se vuelvan a mostrar (con opciones de visualización en caché, como el fondo). Por lo tanto, la vista que hemos rastreado ahora no es una vista real del elemento, y cambiar su fondo no hace nada con la vista del elemento real. Como resultado, tenemos múltiples elementos seleccionados.


Necesitas 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 configure android:choiceMode="singleChoice" en su ListView.


Para mantener el color del elemento de vista de lista cuando lo presiona, incluya la siguiente línea en el diseño de su elemento de vista de lista:

android:background="@drawable/bg_key"

A continuación, defina bg_key.xml en una carpeta bg_key.xml como esta:

<?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 su ListView onClickListener :

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

De esta forma, solo un elemento será seleccionado por 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>


Una forma de hacerlo es realizar un seguimiento de la posición seleccionada actual 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 una ID al diseño principal (linearLayout, boxLayout, relativeLayout, .. Lo que prefiera) de su elemento de la lista.

Luego, en su ListView puede hacer algo como esto:

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, simplemente establece el color de hilight en el diseño como fondo cuando es igual a su posición seleccionada actual. Observe cómo configuro un recurso de fondo dibujable cuando el elemento no está seleccionado. Esto podría ser diferente en su caso (ya que no publicó ningún código). En mi caso, este dibujable es un selector que asegura que el ítem esté iluminado cuando se presiona.

NOTA: Este código simple no usa un titular de vista, pero realmente recomiendo usar uno.


Use la identificación en su lugar:

Este es el método más fácil de 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(); .....


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

Quizás desee guardar el elemento seleccionado actual en una variable global utilizando el índice i.