So implementieren Sie einen Long-Click-Listener in einer Listenansicht


148

Ich möchte OnLongClickListenermeiner Listenansicht hinzufügen . Immer wenn der Benutzer lange auf das Element in der Liste drückt, sollte eine Aktion ausgeführt werden, aber mein Code fängt diesen Listener nicht ab. Bitte lassen Sie mich wissen, wo ich falsch liege. Der ähnliche Code funktioniert setOnItemClickListenersehr gut.

Hier ist der 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;
            }
}); 

Haben Sie daran gedacht, Ihrer Klassendeklaration "implementiert OnItemLongClickListener" hinzuzufügen?
Barry

Sehen Sie in XML, ob ein langer Klick aktiviert ist.
Verbinden Sie das Leben mit Android

Vielleicht haben Sie einen Gestenhörer oder so etwas, der die lange Presse erfasst und verbraucht.
Jon Zangitu

Antworten:


316

Sie müssen setOnItemLongClickListener () in der ListView festlegen:

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

Das XML für jedes Element in der Liste (sollten Sie ein benutzerdefiniertes XML verwenden) muss ebenfalls vorhanden sein android:longClickable="true"(oder Sie können die Convenience-Methode verwenden lv.setLongClickable(true);). Auf diese Weise können Sie eine Liste mit nur einigen Elementen erstellen, die auf Longclick reagieren.

Hoffe das wird dir helfen.


25
Rufen Sie lv.setLongClickable(true);auch an.
Chris Lacy

15
Das hat bei mir nicht funktioniert. Aber das tut:lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {...
Luis A. Florit

irgendwie adroid: longClickable = "true" ist Standard. Ich verwende API 19. Ich musste es also überhaupt nicht angeben.
user1592714

2
Android setzt longClickable = true, wenn der Listener eingestellt wird.
Steven Spungin

Welcher Wert ist in der langen ID gespeichert? in public boolean onItemLongClick (AdapterView <?> arg0, Ansicht arg1, int pos, lange ID
Femn Dharamshi

26

Wenn Ihre Listview Zeile Element an einen separaten XML - Datei verweist, müssen Sie hinzufügen android:longClickable="true"zu dieser Layout - Datei zusätzlich zu Einstellung setOnItemLongClickListener()zu Ihrem Listview.


Vielen Dank! Schlug meinen Kopf mit diesem.
Shaihi

15

oder versuchen Sie diesen 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

Ich denke, dieser obige Code funktioniert bei LongClicking der Listenansicht, nicht der einzelnen Elemente.

warum nicht verwenden registerForContextMenu(listView). und erhalten Sie dann den Rückruf in OnCreateContextMenu.

In den meisten Anwendungsfällen funktioniert dies genauso.


2

In XML hinzufügen

<ListView android:longClickable="true">

In der Java-Datei

lv.setLongClickable(true) 

versuchen Sie dies 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

das sollte funktionieren

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

Vergessen Sie auch nicht, dies in Ihrer XML-Datei zu tun. android:longClickable="true"Wenn Sie eine benutzerdefinierte Ansicht haben, fügen Sie diese Ihrer benutzerdefinierten Ansichtsklasse hinzuyouCustomView.setLongClickable(true);

Hier ist die Ausgabe des obigen Codes Geben Sie hier die Bildbeschreibung ein


1

Ich habe die meisten dieser Antworten ausprobiert und sie scheiterten alle bei TextViews, bei denen die automatische Verknüpfung aktiviert war, die aber auch lange Zeit an derselben Stelle drücken mussten!

Ich habe eine benutzerdefinierte Klasse erstellt, die funktioniert.

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

Dies funktionierte für mich für cardView und funktioniert genauso für die Listenansicht in Adapter-Calss innerhalb der onBindViewHolder()Funktion

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

0

Wenn Sie dies im Adapter tun möchten, können Sie dies einfach tun:

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

Auf jeden Fall macht der Trick.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.