Android – ListView – performItemClick

Estoy enfrentando algunas dificultades cuando trato de usar la función performItemClick de ListView.

Todo lo que quiero hacer es realizar un clic programáticamente en el primer elemento de la lista.

¿Cómo puedo hacer eso? Busqué esa función en la documentación, pero realmente no entendí sus parámetros.

Intenté algo como:

myListView.performItemClick(myListView.getChildAt(0), 0, myListView.getChildAt(0).getId()); 

Pero no funcionó (myListView.getChildAt(0) returns null)

¡Gracias de antemano!

 mList.performItemClick( mList.getAdapter().getView(mActivePosition, null, null), mActivePosition, mList.getAdapter().getItemId(mActivePosition)); 

¡Donde mActivePosition es su posición de clic! ¡Todo lo mejor! 🙂

Esto funcionó para mí.

 listView.performItemClick( listView.getAdapter().getView(position, null, null), position, position); 

use el adaptador para obtener la vista de la posición del artículo. Los otros 2 parámetros que no quería, así que los dejé nulos. Dejar convertView null hace que el adaptador muestre una nueva vista. Es un problema de rendimiento, pero como esto solo ocurre de vez en cuando, no tendrá mucho efecto. No necesito especificar el padre para nada porque no lo estoy usando.

posición es el lugar donde se encuentra su artículo. Además, estas 2 líneas de código antes de su performItemClick crean la ilusión de tener el elemento de la lista seleccionado. También aseguran que el elemento apropiado esté en la pantalla.

 listView.requestFocusFromTouch(); listView.setSelection(position); 

Esto funciona mejor para mi Ejecuta esto en el hilo principal.

 new Handler().post(new Runnable() { @Override public void run() { mList.performItemClick( mList.getChildAt(mActivePosition), mActivePosition, mList.getAdapter().getItemId(mActivePosition)); } }); 

Esto es similar a la respuesta de José Arun, pero pondrá en cola un mensaje al hilo principal para dar al ListView algún tiempo para iniciar.

Probé el código a continuación y funcionó.

 getListView().performItemClick(null, 0, getListAdapter().getItemId(0)); 

El primer parámetro (vista) puede ser nulo.

Yo fui con

 listView.getAdapter().getView(position, null, null).performClick(); 
 mList.performItemClick( mList.getChildAt(mActivePosition), mActivePosition, mList.getAdapter().getItemId(mActivePosition)); 

donde mActivePosition es la posición de la vista secundaria en la Vista de lista.

Usando el código @sulal propuesto, puede colocarlo en onLoadFinished, si usa un LoaderManager. Por ejemplo, algo así como

 @Override public void onLoadFinished(Loader loader, Cursor data) { //.... // mSelectedId keeps the currently selected id // INVID is an invalid value if (mSelectedId == INVID) { // nothing selected // sulal's code new Handler().post(new Runnable() { @Override public void run() { mList.performItemClick( mList.getChildAt(mActivePosition), mActivePosition, mList.getAdapter().getItemId(mActivePosition)); mSelectedId = mList.getAdapter().getItemId(mActivePosition); } }); } 

mActivePosition puede ser 0 (es decir, la posición en el primer elemento) o una posición mantenida durante, por ejemplo, en Pausa

En Firstly traté de usar este código en mi Fragment (Master / Detail -> NameListFragment)

 getListView().performItemClick(null, 0, getListView().getAdapter().getItemId(0)); 

Pero no funcionó. Cuando hice el @Override onStart() en fragmento y moví mi código a onStart() . Después de eso, funciona correctamente para mí.

Estaba trabajando con performItemClick y funcionó para mí, pero con un pequeño problema. intenté colorear el fondo del elemento presionado, pero nunca funcionó, solo tenga en cuenta que si pasa la vista convertida como null (el segundo parámetro) y luego intenta hacer algo en OnClick (), esto no se realizará porque el método getView () del adaptador le da un objeto de vista diferente. necesita manipular el método getView () de su adaptador para capturar la Vista, de modo que pueda usarla.

Si está trabajando en un caso de prueba de unidad. Intente utilizar getInstrumentation (), waitForIdleSync (), para esperar que se cargue la lista, y extienda ActivityInstrumentationTestCase2. Consulte esta respuesta .

Hoy me encuentro con este problema raro y trato de solucionarlo lo mejor posible. Mi condición es que, cuando inicie por primera vez el diseño, necesito verificar algún elemento. Pero cuando uso gridView.getChildAt (posición), siempre devuelvo nulo. Me encontré con este problema antes, causado por No terminar el diseño de dibujo. Entonces envío un mensaje de correo. handler.postDelayed (.., ..), Funciona. Gracias, quienes mueven esta Excepción.

esto puede ser viejo, pero esto puede ayudar:

 lvList.performItemClick(null, index, lvList.getItemIdAtPosition(index) ); 

NOTA: el primer parámetro es nulo y seguirá funcionando, si tiene un adaptador personalizado, convertView se llenará con diseño y vista personalizados, y tal.

-cheers / codificaciones felices.

Este trabajo para mí Si obtiene resultados extraños al usar getView, esto se debe a que el elemento de la lista que desea no existe dentro de las partes visibles. Utilizar a continuación:

 private View getViewFromAdapterByPosition(int position, ListView listView) { View view; int firstVisiblePos = listView.getFirstVisiblePosition(); int lastVisiblePos = listView.getLastVisiblePosition(); if (position < firstVisiblePos || position > lastVisiblePos) { view = listView.getAdapter().getView(position, null, listView); } else { view = listView.getChildAt(position - firstVisiblePos); } return view; } 

Y entonces,

 listView.performItemClick(getViewFromAdapterByPosition(index, listView), index, 0); 

Al utilizar Listview (adaptador de matriz simple o adaptador personalizado), defina listview y, finalmente, realice make click.

Por ejemplo:

  //At onCreate function: lv = (ListView) findViewById(R.id.listView); lv.setAdapter(new CustomAdapter(List_item.this, list, images)); lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView< ?> parent, View view, int position, long id) { // on click function works } } int position = 0; lv.performItemClick(lv.getAdapter().getView(position, null, null), position, lv.getAdapter().getItemId(position)); 

Nota: Después de crear setOnItemClickListener, solo debe hacer clic en Realizar. De lo contrario, no será correcto.

Prueba este:

 public static boolean performClicKOnLisViewFromIndex(ListView listView, int index){ if(listView != null){ if(listView.getAdapter()!= null && listView.getAdapter().getCount() >0 && listView.getAdapter().getCount() > index ){ listView.performItemClick( listView.getAdapter().getView(index, null, null), index, listView.getItemIdAtPosition(index)); return true; } } return false; } 

El performClick probablemente se invocó antes de que se completara listview, puso breakpoint en getView y en performItemClick y verificó cuál se llama primero

getListView().performItemClick(null, 0, 0) hizo el truco para mí (para la posición 0 ).

Dejar caer algo de experiencia .

El uso de listview1.performItemClick también activará listview1.OnItemClickListener si está utilizando el oyente con la misma lista de vista en su código.

 Hope It helps 

Si obtiene resultados extraños al usar getView , esto se debe a que el elemento de la lista que desea no existe dentro de las partes visibles. Utilizar a continuación:

 private View getViewFromAdapterByPosition(int position, ListView listView) { View view; int firstVisiblePos = listView.getFirstVisiblePosition(); int lastVisiblePos = listView.getLastVisiblePosition(); if (position < firstVisiblePos || position > lastVisiblePos) { view = listView.getAdapter().getView(position, null, listView); } else { view = listView.getChildAt(position - firstVisiblePos); } return view; } 

Y entonces,

 listView.performItemClick(getViewFromAdapterByPosition(index, listView), index, 0); 

Esto funciona para mí:

 listview.getSelectedView().performClick(); 

Esto funcionó para mí:

 listView.getAdapter().getView(1, null, null).performClick(); 

Esto es de Begining Android Games. Crea una lista simple de elementos en los que puede hacer clic para abrir una nueva actividad. Cada elemento de la lista, por supuesto, también debería agregarse a AndroidManifest.xml como una actividad separada con un nombre .ListItem #.

 public class MainActivity extends ListActivity { String tests[] = { "ListItem1", "ListItem2", "ListItem3", "ListItem4"}; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, tests)); } @Override protected void onListItemClick(ListView list, View view, int position, long id) { super.onListItemClick(list, view, position, id); String testName = tests[position]; try { Class< ?> classInstance = Class.forName("your.package.name." + testName); Intent intent = new Intent(this, classInstance); startActivity(intent); } catch (ClassNotFoundException e) { e.printStackTrace(); } } 

}