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;
            }
}); 
Techayu
quelle
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.

Dinesh Sharma
quelle
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.

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

Nandeesh
quelle
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;
            }
        });
Vijay Sharma
quelle
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

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

Auf jeden Fall macht der Trick.

Kalaiyo5
quelle