web-dev-qa-db-fra.com

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

Je souhaite ajouter OnLongClickListener à la liste. Chaque fois que l'utilisateur appuie longuement sur l'élément de la liste, une action doit être effectuée, mais mon code ne capture pas cet écouteur. S'il vous plaît laissez-moi savoir où je vais mal. Le code similaire fonctionne très bien pour setOnItemClickListener.

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;
            }
}); 
140
techayu

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 à longclick.

J'espère que ceci vous aidera.

300
Dinesh Sharma

Si votre élément ListView row fait référence à un fichier XML distinct, veillez à ajouter Android:longClickable="true" à ce fichier de présentation en plus de définir setOnItemLongClickListener() sur votre ListView.

22
Jonathan Lin

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;
            }
}); 
15
Ardi

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

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

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

6
nandeesh

En xml ajouter 

<ListView Android:longClickable="true">

En fichier Java

lv.setLongClickable(true) 

essayez cette 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;
            }
        });
2
Vijay Sharma

cela devrait marcher 

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

de plus, n'oubliez pas d'ajouter dans votre code XML Android:longClickable="true" ou si vous avez une vue personnalisée, ajoutez ceci à votre classe de vue personnalisée youCustomView.setLongClickable(true);

voici la sortie du code ci-dessus  enter image description here

1
Ayoub

J'ai essayé la plupart de ces réponses et elles échouaient toutes pour TextViews qui permettait l'activation de la liaison automatique, mais devait aussi utiliser la presse longue au même endroit!

J'ai créé un cours personnalisé 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();
    }
}
1
Oliver Dixon

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

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

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

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