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:
- Imagen local a través de json local en android
- Deslizar Actualizar diseño enRefresh trabajando pero no mostrando el indicador de actualización
- Cómo poner valores de una vista de texto en una fila de una vista de lista a un fragmento
- Android expandiblelistview no puede mostrar el último grupo cuando se ha expandido
- Alinear dos TextViews, una izquierda a la otra derecha, en un ListView sin estirar los fondos
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(); } }); } }
- ListView: selectores dibujables dibujados en diferentes tamaños
- Detener la animación de desplazamiento ListView
- Selección múltiple en ListView personalizado con CAB
- ListView OnItemClickListener con una nueva actividad
- Focusable EditText dentro de ListView
- Adaptador personalizado Android: elementos de lista sólo rellenados al desplazarse
- ¿Dónde cargar los datos de un adaptador? ¿En Actividad? O en el adaptador?
- Filtro de búsqueda de Android para la vista de lista
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 enCHOICE_MODE_SINGLE
, la lista permite que hasta un elemento esté en un estado elegido. Al establecer el choiceMode enCHOICE_MODE_MULTIPLE
, la lista permite seleccionar cualquier número de elementos.Parámetros :
choiceMode
Uno deCHOICE_MODE_NONE
,CHOICE_MODE_SINGLE
oCHOICE_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:
- Establezca el modo de selección correcto en la vista de lista.
setChoiceMode
-
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 añadiendo un submenú a un menuItem, donde es addSubMenu ()?
- ¿Cómo puedo permitir que los probadores beta / beta de las aplicaciones de Android descarguen la aplicación de forma gratuita?