web-dev-qa-db-fra.com

Android - ListView - performItemClick

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!

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

Où mActivePosition est votre position de clic! Bonne chance! :)

63
Arun Jose

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);
26
Steven

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.

14
sulai

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.

6
Blehi

J'y suis allé avec

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

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

2
nick9999

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 .

1
dinhokz

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;
    }
1
Maxime Claude

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.

1
Khwarezm Shah

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

1
denispyr

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.

1
User Learning

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.

1
innershows

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.

1
ralphgabb

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);
1
sandeep negi

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.

1
Gal Rom

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

0
user1034443

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);
0
phi

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  
0
HourGlass

Cela a fonctionné pour moi:

listView.getAdapter().getView(1, null, null).performClick();
0
Drilon Kastrati

getListView().performItemClick(null, 0, 0) a fait le tour pour moi (pour la position 0).

0
AlikElzin-kilaka

Cela fonctionne pour moi:

listview.getSelectedView().performClick();
0
hamidjahandideh