comment implémenter un écouteur de clic long sur une liste


148

Je veux ajouter OnLongClickListenerà ma vue de liste. Chaque fois que l'utilisateur appuie longuement sur l'élément de la liste, une action doit être effectuée, mais mon code n'attrape pas cet écouteur. Faites-moi savoir où je vais mal. Le code similaire fonctionne setOnItemClickListenertrès bien.

Voici le code:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            public boolean onItemLongClick(AdapterView<?> arg0, View v,
                    int index, long arg3) {
                // TODO Auto-generated method stub
                 Log.d("in onLongClick");
                 String str=listView.getItemAtPosition(index).toString();

                 Log.d("long click : " +str);
                return true;
            }
}); 

Vous êtes-vous souvenu d'ajouter "implements OnItemLongClickListener" à votre déclaration de classe?
barry

voir en xml si le clic long est activé?
Connecter la vie avec Android le

Peut-être avez-vous un Gesture Listener ou quelque chose comme ça qui capture la longue pression et la consomme.
Jon Zangitu

Réponses:


317

Vous devez définir setOnItemLongClickListener () dans ListView:

lv.setOnItemLongClickListener(new OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                    int pos, long id) {
                // TODO Auto-generated method stub

                Log.v("long clicked","pos: " + pos);

                return true;
            }
        }); 

Le XML pour chaque élément de la liste (si vous utilisez un XML personnalisé) doit également avoir android:longClickable="true"(ou vous pouvez utiliser la méthode pratique lv.setLongClickable(true);). De cette façon, vous pouvez avoir une liste avec seulement quelques éléments répondant à un clic long.

J'espère que ceci vous aidera.


25
Assurez-vous d'appeler lv.setLongClickable(true);également.
Chris Lacy

15
Cela n'a pas fonctionné pour moi. Mais cela fait:lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {...
Luis A. Florit

en quelque sorte adroid: longClickable = "true" est la valeur par défaut. J'utilise l'API 19. Je n'ai donc pas du tout besoin de le spécifier.
user1592714

2
Android définit longClickable = true lors de la configuration de l'écouteur.
Steven Spungin

quelle valeur est stockée dans long id? in public boolean onItemLongClick (AdapterView <?> arg0, View arg1, int pos, long id
Femn Dharamshi

26

Si votre élément de ligne ListView fait référence à un fichier XML distinct, assurez-vous de l'ajouter android:longClickable="true"à ce fichier de mise en page en plus du paramètre setOnItemLongClickListener()de votre ListView.


Merci! Je me cognais la tête avec celui-ci.
Shaihi

15

ou essayez ce code:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            public boolean onItemLongClick(AdapterView<?> arg0, View v,
                    int index, long arg3) {

    Toast.makeText(list.this,myList.getItemAtPosition(index).toString(), Toast.LENGTH_LONG).show();
                return false;
            }
}); 

6

Je pense que ce code ci-dessus fonctionnera sur LongClicking la liste, pas les éléments individuels.

pourquoi ne pas l'utiliser registerForContextMenu(listView). puis obtenez le rappel dans OnCreateContextMenu.

Pour la plupart des cas d'utilisation, cela fonctionnera de la même manière.


2

Dans xml ajouter

<ListView android:longClickable="true">

Dans le fichier java

lv.setLongClickable(true) 

essayez ce setOnItemLongClickListener ()

lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int pos, long l) {
                //final String category = "Position at : "+pos;
                final String category = ((TextView) view.findViewById(R.id.textView)).getText().toString();
                Toast.makeText(getActivity(),""+category,Toast.LENGTH_LONG).show();
                args = new Bundle();
                args.putString("category", category);
                return false;
            }
        });

1

cela devrait fonctionner

ListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                                           int pos, long id) {
                // TODO Auto-generated method stub

                Toast.makeText(getContext(), "long clicked, "+"pos: " + pos, Toast.LENGTH_LONG).show();

                return true;
            }
        });

n'oubliez pas non plus de dans votre xml android:longClickable="true"ou si vous avez une vue personnalisée, ajoutez-la à votre classe de vue personnaliséeyouCustomView.setLongClickable(true);

voici la sortie du code ci-dessus entrez la description de l'image ici


1

J'ai essayé la plupart de ces réponses et elles échouaient toutes pour TextViews qui avait activé la liaison automatique, mais qui devait également utiliser une pression longue au même endroit!

J'ai créé une classe personnalisée qui fonctionne.

public class TextViewLinkLongPressUrl extends TextView {

    private boolean isLongClick = false;

    public TextViewLinkLongPressUrl(Context context) {
        super(context);
    }

    public TextViewLinkLongPressUrl(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TextViewLinkLongPressUrl(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(text, type);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_UP && isLongClick) {
            isLongClick = false;
            return false;
        }

        if (event.getAction() == MotionEvent.ACTION_UP) {
            isLongClick = false;
        }

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            isLongClick = false;
        }

        return super.onTouchEvent(event);
    }

    @Override
    public boolean performLongClick() {
        isLongClick = true;
        return super.performLongClick();
    }
}

0

Cela a fonctionné pour moi pour cardView et fonctionnera de la même manière pour listview à l'intérieur des cals d'adaptateur, dans la onBindViewHolder()fonction

holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                return false;
            }
        });

0

Si vous souhaitez le faire dans l'adaptateur, vous pouvez simplement le faire:

itemView.setOnLongClickListener(new View.OnLongClickListener()
        {
            @Override
            public boolean onLongClick(View v) {
                Toast.makeText(mContext, "Long pressed on item", Toast.LENGTH_SHORT).show();
            }
        });

0
    listView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
        return false;
    }
});

Fait vraiment l'affaire.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.