Je rencontre quelques difficultés lorsque j'essaie d'utiliser la fonction performItemClick de ListView.
Tout ce que je veux, c'est effectuer un clic par programme dans le premier élément de la liste.
Comment puis je faire ça? J'ai consulté cette fonction dans la documentation, mais je ne comprenais pas vraiment ses paramètres.
J'ai essayé quelque chose comme:
myListView.performItemClick(myListView.getChildAt(0), 0, myListView.getChildAt(0).getId());
Mais ça n'a pas marché (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 correspondant à la position de l'élément. Les 2 autres paramètres que je ne voulais pas alors je les ai laissés nuls. Si vous quittez convertView null, l’adaptateur restitue une nouvelle vue. C'est un problème de performances, mais comme cela ne se produit que de temps en temps, cela n'aura pas beaucoup d'effet. Je n'ai pas besoin de spécifier le parent pour quoi que ce soit parce que je ne l'utilise pas.
position est simplement l'endroit où se trouve votre élément . De plus, ces 2 lignes de code avant votre performItemClick créent l'illusion de sélectionner l'élément de liste. 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 un message en file d'attente au thread principal pour donner à la variable ListView
un peu de temps pour être lancée.
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 null.
J'y suis allé avec
listView.getAdapter().getView(position, null, null).performClick();
mList.performItemClick(
mList.getChildAt(mActivePosition),
mActivePosition,
mList.getAdapter().getItemId(mActivePosition));
où mActivePosition
est la position de la vue enfant dans la vue liste.
Si vous travaillez sur un scénario de test unitaire, essayez d'utiliser getInstrumentation (). WaitForIdleSync (), attendez que la liste soit chargée et étendez le ActivityInstrumentationTestCase2 Consultez cette answer .
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;
}
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 utilisé la méthode @Override onStart()
dans un fragment et que j'ai déplacé mon code vers onStart()
. Après cela fonctionne correctement pour moi.
En utilisant le code proposé par @sulal, vous pouvez le placer dans onLoadFinished si vous utilisez LoaderManager. Quelque chose comme
@Override
public void onLoadFinished(Loader<Cursor> 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, par exemple, onPause
Lorsque vous utilisez Listview (adaptateur multidisque ou adaptateur personnalisé), définissez listview et d'autres actions, cliquez enfin.
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éé uniquement setOnItemClickListener, vous devez appeler Perform click. Sinon, ce ne sera pas correctement.
Je viens de rencontrer ce problème monstre aujourd'hui et je fais de mon mieux pour y faire face. Ma condition est, quand je commence la mise en page, j'ai besoin de faire vérifier certains éléments . Mais lorsque j'utilise gridView.getChildAt (position), retourne toujours null. J'ai rencontré ce problème auparavant, causé par la fin de la mise en page. Alors j'envoie un message postal. handler.postDelayed (.., ..), Cela fonctionne. Merci pour cette exception.
cela 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, etc.
-cheers/codages heureux.
Ce travail pour moi Si vous obtenez un résultat étrange lors de l’utilisation de getView, c’est que l’élément de la liste que vous voulez n'existe pas. 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);
je travaillais avec performItemClick et cela a fonctionné pour moi, mais avec un petit problème . paramètre) et ensuite essayer de faire quelque chose sur OnClick (), cela ne sera pas le cas, car la méthode getView () de l’adaptateur vous donne un objet View différent . Voir afin que vous puissiez qork sur elle.
Le performClick est probablement appelé avant le remplissage de listview, placez un point d'arrêt dans getView et sur performItemClick, puis cochez le premier appel
Si vous obtenez un résultat étrange avec getView
, c'est 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);
Baisser un peu d'expérience .
l'utilisation de listview1.performItemClick déclenchera également votre listview1.OnItemClickListener si vous utilisez l'écouteur avec la même liste dans votre code.
Hope It helps
Cela a fonctionné pour moi:
listView.getAdapter().getView(1, null, null).performClick();
getListView().performItemClick(null, 0, 0)
a fait le tour pour moi (pour la position 0
).
Cela fonctionne pour moi:
listview.getSelectedView().performClick();