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;
            }
}); 
techayu
la source
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.

Dinesh Sharma
la source
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.

Jonathan Lin
la source
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;
            }
}); 
Ardi
la source
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.

nandeesh
la source
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;
            }
        });
Vijay Sharma
la source
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

Ayoub
la source
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();
    }
}
Oliver Dixon
la source
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;
            }
        });
niks
la source
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();
            }
        });
user846316
la source
0
    listView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
        return false;
    }
});

Fait vraiment l'affaire.

Kalaiyo5
la source