Programe seleccionar el elemento ListView en Android

Tengo dos fragmentos. El primero con botones en el interior, el otro con un ListView dentro (ListFragment).

Quisiera que el primer fragmento (gracias a sus botones) permitiera al usuario examinar el ListView que está en el segundo fragmento.

Así que quiero que el ListView sea controlado por el primer fragmento con botones.

No tengo ningún problema que comunica entre el fragmento (que envía órdenes del 1r fragmento al 2do), pero no sé decir a mi ListView para seleccionar (programmatically) un artículo particular de la lista.

¿Qué tipo de ListView debo usar y cómo puedo decirle a ListView para seleccionar / resaltar / enfocar uno de sus elementos?

Estoy en modo de contacto cuando el usuario presiona los botones del primer fragmento.

¿Debo usar setFocusableInTouchMode(true) o setChoiceMode(ListView.CHOICE_MODE_SINGLE) o algo más?

Esto es para todos los que tratan de:

Seleccionar programaticamente un elemento en un ListView

Hacer que este elemento permanezca resaltado

Estoy trabajando en Android ICS, no sé si funciona para todos los niveles Api.

Primero crea un listview (o hazlo si ya estás en un listActivity / listFragment)

A continuación, establezca el modo de elección de su lista a solo con: Mylistview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

A continuación, seleccione programaticamente su elemento con: Mylistview.setItemChecked(position, true); (Siendo la posición un número entero que indica el rango del elemento a seleccionar)

Ahora su elemento está realmente seleccionado, pero es posible que no vea absolutamente nada porque no hay retroalimentación visual de la selección. Ahora tiene dos opciones: puede utilizar una lista de vista pre-construido o su lista personalizada.

1) Si quieres una lista de vista pre-construida, intenta simple_list_item_activated_1 , simple_list_item_checked , simple_list_item_single_choice , etc …

Usted puede configurar su listview como esto por ejemplo: setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_activated_1, data))

Después de que listview pre-construido usted eligió usted verá ahora que cuando está seleccionado usted tiene una caja marcada o el color del backgound cambiado, etc …

2) Si utiliza un listview personalizado, definirá un diseño personalizado que se utilizará en cada elemento. En este diseño XML, usted asignará un selector para cada vista de parte en la fila que necesita ser cambiado cuando se selecciona.

Digamos que cuando se selecciona desea que su fila cambie el color del texto y el color del fondo. Su diseño XML se puede escribir como:

 <?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/menu_item_background_selector" android:orientation="horizontal" > <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical" android:textColor="@drawable/menu_item_text_selector" /> 

Ahora, en la carpeta dibujable puede crear menu_item_background_selector.xml y menu_item_text_selector.xml.

Menu_item_text_selector.xml:

  <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true" android:color="#FFF"> </item> <item android:state_pressed="true" android:color="#FFF"> </item> <item android:state_pressed="false" android:color="#000"> </item> </selector> 

El texto será blanco cuando esté seleccionado.

A continuación, haga algo similar para su fondo: (recuerde que no está obligado a utilizar el color, pero también puede utilizar drawables)

Menu_item_background_selector.xml:

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true" android:color="#0094CE"> </item> <item android:state_pressed="true" android:color="#0094CE"> </item> <item android:state_pressed="false" android:color="#ACD52B"> </item> </selector> 

Aquí el fondo es azul cuando está seleccionado y verde cuando no está seleccionado.

El elemento principal que faltaba era android:state_activated . Hay de hecho (demasiado) muchos estados: activado, presionado, enfocado, controlado, seleccionado …

No estoy seguro si el ejemplo que di con android:state_activated and android:state_pressed es el mejor y más limpio, pero parece que funciona para mí.

Pero no necesitaba hacer mi propia clase con el fin de obtener una Custom CheckableRelativeLayout (que era sucia y aterrador) ni he utilizado CheckableTextViews. No sé por qué otros utilizaron tales métodos, tal vez depende del nivel de Api.

Pruebe AbsListView.performItemClick (…)

Vea este post sobre cómo usar performItemClick .

Esto es lo que funcionó para mí:

1) Defina el comportamiento de elección para la Lista.

  mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

2) Establece el estado marcado de la posición especificada.

 mListView.setItemChecked(1,true); //Don't make the same mistake I did by calling this function before setting the listview adapter. 

3) Agregue un nuevo estilo dentro del recurso de estilo (res / values) así:

 <style name="activated" parent="android:Theme.Holo"> <item name="android:background">@android:color/holo_green_light</item> </style> 

Siéntase libre de usar los colores que quiera.

4) Utilice el estilo previamente definido en su ListView:

 <ListView android:id="@+id/listview" style="@style/activated" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:divider="@android:color/transparent" android:dividerHeight="0dp"/> 

O en el diseño que usas como fila.

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/activated" > <!--widgets for your row here--> </LinearLayout> 

¡Esperanza que ayuda a cualquier persona!

La respuesta de Jecimi funcionó para mí, excepto por una pequeña parte. Me gustaría compartirlo para otros. Llamando list.setItemChecked( 0, true ); In onCreate () de FragmentActivity no funcionó. En getView() del adaptador list.getCheckedItemPosition( ) devuelto -1.

Tengo que llamar a este método de protected void onPostCreate( Bundle savedInstanceState ) .

Pruebe mListView.setSelection(position);

Puede utilizar ListView#setSelection(int)

 package com.example.samsung; import com.example.samsung.*; import com.example.samsung.R; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.Spinner; import android.widget.Toast; public class Firstscreen extends Activity implements OnItemSelectedListener { Button btn; Spinner sp; public String[] product = { "ML-1676P/XIP","SLM2021W/XIP","SL-M2826ND/XIP","SL-M2826ND/XIP","SL-M2826ND/XIP","SL-M3320ND/XIP","SL-M3820ND/XIP","SL-M4020ND/XIP"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_firstscreen); btn = (Button) findViewById(R.id.bn); sp= (Spinner) findViewById(R.id.sp); } public void button (View v){ { Intent i = new Intent(Firstscreen.this,ML1676P.class); startActivity(i); } Spinner s1 = (Spinner) findViewById(R.id.sp); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, product); // find other layout parameters s1.setAdapter(adapter); s1.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }); } private Object product() { // TODO Auto-generated method stub return null; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.firstscreen, menu); return true; } @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } } 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".Firstscreen" android:orientation="vertical" > <TextView android:id="@+id/tv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#FF35B5E5" android:layout_centerInParent="true" android:text="CHOOSE THE PRODUCT FROM THE LIST" /> <Spinner android:id="@+id/sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:drawSelectorOnTop="true" /> <Button android:id="@+id/bn" android:layout_width="285dp" android:layout_height="wrap_content" android:text=" GO " android:onClick="button"/> </LinearLayout> 

Seleccione un elemento en un listview que debe ir a la página específica del elemento seleccionado cuando se hace clic en el botón cómo hacerlo. El código es un fragmento anterior

Me gusta esto:

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { try { int pos = 0; listview.performItemClick(null, pos, listview.getItemIdAtPosition(pos) ); } catch (Exception e) { e.printStackTrace(); } } } 

Simplemente agregue la siguiente línea al diseño de su listview personalizado:

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

Para un ejemplo completo de trabajo, consulte:

Https: //[email protected]/elimelec/custombaseadapter.git

  • Cómo actualizar algunos datos en un ListView sin utilizar notifyDataSetChanged ()?
  • Barra de desplazamiento personalizada de Android
  • Problemas de procesamiento Excepción generada durante la renderización: las matrices de color y posición deben tener la misma longitud
  • ¿Cómo puedo obtener mi ListView para desplazarse?
  • ¿Cómo puedo hacer que mi ArrayAdapter siga el patrón ViewHolder?
  • La mejor manera de reordenar elementos en Android 4 + ListView
  • Los elementos ListView y de altura variable provocan problemas de desplazamiento
  • Mantener la posición de desplazamiento cuando se agrega a ListView con desplazamiento inverso sin fin
  • Actualizaciones de datos de Android ListView ArrayAdapter Mejores prácticas
  • ¿Cómo establecer alturas diferentes para cada fila en un ListView?
  • Horizontal RecyclerView dentro de ListView sin desplazamiento muy suave
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.