come implementare un listener di clic lunghi in una visualizzazione elenco


148

Voglio aggiungere OnLongClickListenersulla mia vista elenco. Ogni volta che l'utente preme a lungo l'elemento nell'elenco, è necessario eseguire alcune azioni, ma il mio codice non rileva questo ascoltatore. Per favore fatemi sapere dove sto andando storto. Il codice simile funziona setOnItemClickListenermolto bene.

Ecco il codice:

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

Ti sei ricordato di aggiungere "implementa OnItemLongClickListener" alla tua dichiarazione di classe?
Barry,

vedere in xml se il clic lungo è abilitato?
Collegamento vita con Android

Forse hai un ascoltatore di gesti o qualcosa del genere che sta catturando la stampa lunga e la sta consumando.
Jon Zangitu,

Risposte:


317

Devi impostare setOnItemLongClickListener () in 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;
            }
        }); 

Anche l'XML per ciascun elemento dell'elenco (se si utilizza un XML personalizzato) deve avere android:longClickable="true"(oppure è possibile utilizzare il metodo convenienza lv.setLongClickable(true);). In questo modo puoi avere un elenco con solo alcuni elementi che rispondono al clic lungo.

Spero che questo ti possa aiutare.


25
Assicurati di chiamare lv.setLongClickable(true);anche.
Chris Lacy,

15
Questo non ha funzionato per me. Ma questo fa:lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {...
Luis A. Florit il

in qualche modo adroid: longClickable = "true" è l'impostazione predefinita. Sto usando API 19. Quindi non ho dovuto specificarlo affatto.
user1592714

2
Android imposta longClickable = true quando si imposta l'ascoltatore.
Steven Spungin,

quale valore è memorizzato nell'ID lungo? in pubblico booleano onItemLongClick (AdapterView <?> arg0, View arg1, int pos, long id
Femn Dharamshi,

26

Se l' elemento della riga di ListView fa riferimento a un file XML separato, assicurarsi di aggiungere android:longClickable="true"a quel file di layout oltre all'impostazione setOnItemLongClickListener()di ListView.


Grazie! Mi batteva la testa con questo.
Shaihi,

15

o prova questo codice:

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

Penso che questo codice sopra funzionerà su LongClicking la lista, non sui singoli elementi.

perché non usare registerForContextMenu(listView). e quindi ottenere il callback in OnCreateContextMenu.

Per la maggior parte dei casi di utilizzo funzionerà allo stesso modo.


2

In xml aggiungi

<ListView android:longClickable="true">

Nel file java

lv.setLongClickable(true) 

prova questo 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

questo dovrebbe funzionare

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

inoltre, non dimenticare di farlo nel tuo XML android:longClickable="true"o se hai una vista personalizzata aggiungila alla tua classe di vista personalizzatayouCustomView.setLongClickable(true);

ecco l'output del codice sopra inserisci qui la descrizione dell'immagine


1

Ho provato la maggior parte di queste risposte e tutti fallivano per TextViews che aveva abilitato il collegamento automatico ma che doveva anche usare la pressione lunga nello stesso posto!

Ho creato un corso personalizzato che funziona.

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

Questo ha funzionato per me per cardView e funzionerà allo stesso modo per listview all'interno dell'adattatore calss, all'interno della onBindViewHolder()funzione

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

0

Se vuoi farlo nell'adattatore, puoi semplicemente farlo:

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

Sicuramente il trucco.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.