Android – ListView – performItemClick

Je suis confronté à des difficultés lorsque j’essaie d’utiliser la fonction performItemClick de ListView.

Tout ce que je veux faire est d’effectuer un clic par programmation dans le premier élément de la liste.

Comment puis je faire ça? J’ai recherché cette fonction dans la documentation, mais je n’ai pas vraiment compris ses parameters.

J’ai essayé quelque chose comme:

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

Mais cela n’a pas fonctionné (myListView.getChildAt(0) returns null)

Merci d’avance!

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

Où mActivePosition est votre position de clic! Bonne chance! 🙂

Cela a fonctionné pour moi.

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

utilisez l’adaptateur pour obtenir la vue de la position de l’élément. Les 2 autres parameters que je ne voulais pas alors je les ai laissés nuls. Le fait de laisser convertir null null provoque le rendu d’une nouvelle vue par l’adaptateur. C’est un problème de performance, mais comme cela ne se produit qu’une fois de temps en temps, cela n’aura pas beaucoup d’effet. Je n’ai pas besoin de spécifier le parent pour quelque chose parce que je ne l’utilise pas.

la position n’est que l’endroit où se trouve votre object. De plus, ces 2 lignes de code avant votre performItemClick créent l’illusion d’avoir l’élément de liste sélectionné. Ils s’assurent également que l’élément approprié est à l’écran.

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

Cela fonctionne mieux pour moi. Exécutez ceci sur le thread principal.

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

Ceci est similaire à la réponse d’Arun Jose, mais il mettra en queue un message sur le thread principal pour donner à ListView temps de se lancer.

J’ai essayé le code ci-dessous et cela a fonctionné.

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

Le premier paramètre (vue) peut être nul.

J’y suis allé avec

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

mActivePosition est la position de la vue enfant dans la vue Liste.

En utilisant le code @sulal proposé, vous pouvez le placer dans onLoadFinished, si vous utilisez un LoaderManager. Par exemple, quelque chose comme

 @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 peut être 0 (c’est-à-dire la position sur le premier élément) ou une position conservée pendant, par exemple, onPause

Au début, j’ai essayé d’utiliser ce code dans mon fragment (Master / Detail -> NameListFragment)

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

Mais ça n’a pas marché. Quand j’ai fait la @Override onStart() en fragment et que j’ai déplacé mon code sur onStart() . Après cela, ça marche bien pour moi.

Je travaillais avec performItemClick et cela a fonctionné pour moi mais avec un petit problème. J’ai essayé de colorer l’arrière-plan de l’élément pressé mais cela n’a jamais fonctionné, remarquez simplement que si vous transmettez la vue de conversion en tant que null (le deuxième paramètre) et que vous essayez de faire quelque chose sur OnClick (), la méthode getView () de l’adaptateur vous donne un object de vue différent. Vous devez manipuler la méthode getView () de votre adaptateur pour intercepter la vue afin de pouvoir y accéder.

Si vous travaillez sur un cas de test unitaire. Essayez d’utiliser getInstrumentation (). WaitForIdleSync () pour attendre le chargement de la liste et étendre ActivityInstrumentationTestCase2 See this answer .

Je viens de faire face à ce problème anormal aujourd’hui et je fais de mon mieux pour y faire face. Ma condition est que lorsque je lance la mise en page pour la première fois, je dois vérifier certains éléments. Mais quand j’utilise gridView.getChildAt (position), retourne toujours null. J’ai rencontré ce problème avant, causé par la fin de la mise en page du dessin. Donc, j’envoie un message postal. handler.postDelayed (.., ..), ça marche. Merci qui propose cette exception.

ceci peut être vieux mais cela peut aider:

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

Remarque: le premier paramètre est null et fonctionnera toujours, si vous avez un adaptateur personnalisé, convertView sera rempli avec une présentation et une vue personnalisées et autres.

-choisir / heureux codages.

Cela fonctionne pour moi Si vous obteniez un résultat étrange en utilisant getView, c’est parce que l’élément de liste souhaité n’existe pas dans les parties visibles. Utilisez ci-dessous:

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

Et alors,

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

Lorsque vous utilisez Listview (adaptateur de tableau simple ou adaptateur personnalisé), définissez listview et tout autre clic effect

Par exemple:

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

Remarque: Après avoir créé le setOnItemClickListener, vous devez uniquement appeler effectuer un clic. Sinon, ce ne sera pas correctement.

Essaye celui-là:

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

Le performClick est probablement appelé avant que listview ne soit rempli, ne mette le point d’arrêt dans getView et sur performItemClick et vérifie ce qui s’appelle en premier

getListView().performItemClick(null, 0, 0) fait l’affaire (pour la position 0 ).

Abandonner une expérience .

En utilisant listview1.performItemClick, vous déclencherez également votre listview1.OnItemClickListener si vous utilisez le listener avec la même listview dans votre code.

 Hope It helps 

Si vous obtenez un résultat étrange lorsque vous utilisez getView , c’est parce que l’élément de liste souhaité n’existe pas dans les parties visibles. Utilisez ci-dessous:

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

Et alors,

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

Cela fonctionne pour moi:

 listview.getSelectedView().performClick(); 

Cela a fonctionné pour moi:

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

Ceci est de commencer des jeux Android. Il crée une liste simple d’éléments sur lesquels vous pouvez cliquer pour ouvrir une nouvelle activité. Chaque élément de la liste doit bien entendu être ajouté à AndroidManifest.xml en tant qu’activité distincte avec un nom .ListItem #.

 public class MainActivity extends ListActivity { Ssortingng 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); Ssortingng 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(); } } 

}